如何解决尝试验证字符串中的字符 - Java
希望我能得到一些帮助。我是新来的,是一名学生开发者。
我正在尝试验证一个字符串以确保它只包含另一个字符串中包含的字符。
有一串随机生成的字符(长度为 12 个),用户输入了一个单词,但只能使用字符串中的字符。
我还需要重复用户输入,直到有一个有效的输入。所以一个循环是必要的。我尝试了很多方法,但由于某种原因无法解决
用户输入将在主类中,然后从另一个类调用方法。
我的逻辑是检查来自用户输入的字符是否与 randomLetters String 中的字符不匹配然后计数。虽然该值大于 0,但存在无效条目,因此应重试。然而,实际发生的事情是:无论用户输入什么,代码仍然继续显示不正确
这是我的代码:
import java.lang.Math;
public class TestValidChar{
private String player1Guess;
private final String ALPHABET;
private String randomLetters;
private StringBuffer strBuff;
private String testValid;
private int validCounter;
public TestValidChar(){
player1Guess=" ";
player2Guess=" ";
ALPHABET = "abcdefghijklmnopqrstuvwxyz";
testValid = " ";
validCounter=0;
}
public void setPlayer1Guess(String player1Guess){
this.player1Guess=player1Guess.toLowerCase();
}
public void setPlayer2Guess(String player2Guess){
this.player2Guess=player2Guess.toLowerCase();
}
public void setRandomLetters(String randomLetters){
randomLetters=" ";
strBuff = new StringBuffer();
//for loop to create a string of 12 random letters -
for (int i = 0; i < 12; i++) {
// generate a random number between
// 0 to 25 (instead of 1-26 for lenght of alphabet)
int index = (int)(ALPHABET.length()* Math.random());
// add Character one by one to strBuff
strBuff.append(ALPHABET.charAt(index));
}//end for loop
randomLetters = strBuff.toString();
this.randomLetters=randomLetters;
}
public void compute(){
validCounter=0;
for(int i=0; i<player1Guess.length(); i++){
for(int j=0; j<randomLetters.length(); j++){
if(player1Guess.charAt(i)!=randomLetters.charAt(j)){
validCounter++;
}
}
}
}
public String getRandomLetters(){
return randomLetters;
}
public int getValidCounter(){
return validCounter;
}
}
和应用类:
import javax.swing.*;
public class TestApp{
public static void main(String[]args){
//data members
String player1Guess;
String player2Guess;
final String ALPHABET;
String randomLetters=" ";
int validCounter;
TestValidChar myTest = new TestValidChar();
myTest.setRandomLetters(randomLetters);
randomLetters=myTest.getRandomLetters();
player1Guess=JOptionPane.showInputDialog(null," Enter word using these letters: " +randomLetters);
myTest.setPlayer1Guess(player1Guess);
myTest.compute();
validCounter=myTest.getValidCounter();
while(validCounter>0){
player1Guess=JOptionPane.showInputDialog(null," Invalid Characters used. Use only " +randomLetters+ " " +validCounter);
myTest.compute();
validCounter=myTest.getValidCounter();
}
}
}
解决方法
我修复了您的代码如下:
public boolean compute() {
validCounter = 0;
for (int i = 0; i < player1Guess.length(); i++) {
for (int j = 0; j < randomLetters.length(); j++) {
if (player1Guess.charAt(i) == randomLetters.charAt(j)) {
// I found a match. The character at player1Guess[i] is ok
validCounter++;
break;
}
}
}
// if all characters are OK returns true.
return validCounter == player1Guess.length();
}
,
核心问题在于计算方法
public void compute(){
validCounter=0;
for(int i=0; i<player1Guess.length(); i++){
for(int j=0; j<randomLetters.length(); j++){
if(player1Guess.charAt(i)!=randomLetters.charAt(j)){
validCounter++;
}
}
}
}
首先它是不明确的,有一个名为 validCounter 的变量,但是当 2 个字符不匹配时,您似乎将其递增。对于参与您的代码的每个人,尤其是您,提供有意义的名称非常重要。
尝试逐步观察为什么此计数器没有您期望的值。以“word”作为 player1Guess 和“drow”作为 randomLetters 为例,遍历循环以查看为什么它会增加多次,尽管您希望它不会,然后相应地更新您的逻辑。
如果您希望“validCounter”仅在“randomLetters”中找不到字母时增加,您可以将其重命名为“invalidCounter”并尝试以下操作:
public void compute() {
invalidCounter = 0;
for (int i = 0; i < player1Guess.length(); i++) {
if (randomLetters.indexOf(player1Guess.charAt(i)) == -1) {
// indexOf returns -1 if char is not found
invalidCounter++;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。