用字符串输入替换隐藏单词的Java循环



我正在学习Java入门课程。最后的任务是创建一个Hangman游戏。规则是:用星号替换隐藏的单词,然后用户可以尝试10次猜单词。对于每个正确的猜测,我们需要替换星号,使其看起来像d*n**。

我在创建一个循环时遇到问题,该循环检查字符串中的字母,然后用正确的字母替换字符串。我应该使用String、char[]数组还是String[]数组?任何指导都将不胜感激。

import java.util.Scanner;
import java.util.Random;
class Hang2 {
public static void main(String args[]) {
final int SUM = 10;
String[] randomWords = {
"catfish",
"donut",
"piano"
};
String word = randomWords[new Random().nextInt(randomWords.length)];
System.out.println(word);
System.out.println();
System.out.println("The length of your word is: ");
String star = word;
for (int i = 0; i < star.length(); i++) {
System.out.print("*");
}
Scanner keyboard = new Scanner(System.in);
System.out.println("nYou have 10 attempts to guess your word, one letter at a time. ");
int attempts = SUM;
String[] chars = new String[] {
star
};
while (attempts > 0) {
System.out.println("Enter a char: ");
String letter = keyboard.nextLine();
letter = letter.toLowerCase();
String letterTrim = letter.trim();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == letterTrim) {
chars = chars.substring(0, 4) + letterTrim + chars.substring(4 + 1);
System.out.println(chars);
} else if (!(chars[i] == letterTrim)) {
attempts--;
System.out.println("Bad guess! You have " + attempts + " attempts.");
}

}
}
}
}

最初,会出现以下行的问题:

else if (!(chars[i] == letterTrim))

这是一个问题,有两个原因最初对我来说很明显

  1. 您正在比较Character值和String值,两者是不同的变量类型
  2. 字符串是对象,需要使用.equals()方法

这里最好有这样的东西

for (int i = 0; i < chars.length; i++) {
String letter = Character.toString(chars[i]);
if (letter.equals(letterTrim)) {
...
} else if (!letter.equals(letterTrim)) {
...
}
}

在上面的代码中,Character值被转换为String,允许您将letter的值与letterTrim的值进行比较。

在Java中,字符串是对象,需要使用.equals()方法来计算相等性,而不是使用==运算符。一个例外是检查String是否为null。然后您需要使用==运算符,如下所示:

String name = null;
if ( name == null ) {
System.out.println("variable name is null.");
}

我还应该补充一点,在Objects上使用==运算符断言它是否是相同的精确对象引用,并且使用赋值运算符=将复制一个object引用,而不是整个对象。例如:

String lastName = "Doe";
String otherLastName = lastName;
if ( lastName == otherLastName ) {
System.out.println("lastName and otherLastName reference the same object");
}

希望这有帮助!

更多信息

评论中指出了以下例子:

String name = "Mike";
if ( name == "Mike" ) {
System.out.println("Same object reference");
}

这将打印if语句中的行。这是因为引用了相同的对象。也就是说,"Mike"是对与变量名称相同的对象的引用。创建一个字符串对象,并将其引用分配给以下行上的变量名称

String name = "Mike";

但是,下面将创建一个新的String对象:

String name = "Mike";
String otherName = new String("Mike");
if ( name != otherName ) {
System.out.println("Different Objects");
}
if ( name == "Mike" ) {
System.out.println(""Mike" is the same Object reference as name.");
}
if ( name.equals(otherName) ) {
System.out.println("The contents of name and otherName are equal");
}

以上会产生"不同的对象","Mike"与name是相同的对象引用",以及"name和otherName的内容相等"。构造函数的使用将完全产生(正如预期的那样)一个新的String对象,尽管它的内容是相同的。这就是使用.equals()方法非常重要的原因。

最新更新