1

Java新手和我被困在一些看起来非常简单的事情上。我为我正在构建的游戏编写了一个算法,并且使用 TDD,我的所有测试都通过了,但实际游戏没有返回正确的反馈。相反,每当我猜到一个正确的字母时,它都会返回一个“w”并且应该返回一个“b”。

背景 游戏首先生成一个 4 个字符的随机代码。游戏的目的是输入猜测并尝试匹配密码。反馈类应该告诉我我的猜测与代码相比是热的还是冷的。

我将猜测和密码传递给班级并计算反馈。猜测是一个字符串,我使用“拆分”将其转换为字符串数组。密码也是一个字符串数组,我为其随机生成 4 个不同的字符串值。我试图检查猜测和密码中的一个元素是否都是字符串,并且两者都为“真”。

问题 问题是我的完全匹配 if 语句永远不会被执行。我读到您应该改用 equals() 并且也尝试过,但出现错误。

任何人都可以帮忙吗?

这是我的反馈类:公共类反馈{

      public String[] guess;
      public String[] secretCode;
      public String[] feedback;

      public String[] get(String[] guess, String[] secretCode) {
        this.guess = Arrays.copyOf(guess, guess.length);
        this.secretCode = Arrays.copyOf(secretCode, secretCode.length);
        feedback = new String[this.secretCode.length];
        findExactMatches();
        findNearMatches();
        findNoMatches();
        sortFeedback();
        return feedback;
      }

      public void findExactMatches() {
        for (int i = 0; i < guess.length; i++) {
          if (guess[i] == secretCode[i]) {
            feedback[i] = "b";
            guess[i] = "x";
            secretCode[i] = "x";
          }
        }
      }

      public void findNearMatches() {
        for (int i = 0; i < guess.length; i++) {
          if ( Arrays.asList(secretCode).contains(guess[i]) && guess[i] != "x" ) {
            feedback[i] = "w";
            int matched_symbol_index = Arrays.asList(secretCode).indexOf(guess[i]);
            secretCode[matched_symbol_index] = "x";
          }
        }
      }

      public void findNoMatches() {
        for (int i = 0; i < guess.length; i++) {
          if ( feedback[i] == null ) {
            feedback[i] = " ";
          }
        }
      }

      public void sortFeedback() {
        Arrays.sort(feedback);
      }
    }
4

3 回答 3

3

比较Strings 时,使用equals而不是==String.equals将比较内容,而==将比较身份(即它们是否是同一个对象)。

所以,

guess[i] == secretCode[i]

应该

guess[i].equals(secretCode[i])

如果您想了解更多信息,那么您可以==将字符串进行实习。但这完全是奖励内容。

编辑:而且,正如 johnchen902 在评论中所说:

而guess[i] != "x" 应该是 !guess[i].equals("x")。(在 findNearMatches() 中)

于 2013-05-26T03:59:02.023 回答
3

这些是strings你应该使用equals的,即guess[i].equals(secretCode[i])

guess[i] == secretCode[i]将比较operator compares the objects’ location(s) in memory"您不想要的两个字符串 (" ) 的引用。

请查看更多信息——http ://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/

同样适用,guess[i] != "x" 因此您将使用! guess[i].equals("x")

于 2013-05-26T03:59:25.370 回答
3

替换guess[i] == secretCode[i]withguess[i].equals(secretCode[i])和 the guess[i] != "x"with !guess[i].equals("x")

==测试参考相等。

.equals()测试值相等。

你可以在这里找到更多信息

public String[] guess;
      public String[] secretCode;
      public String[] feedback;

      public String[] get(String[] guess, String[] secretCode) {
        this.guess = Arrays.copyOf(guess, guess.length);
        this.secretCode = Arrays.copyOf(secretCode, secretCode.length);
        feedback = new String[this.secretCode.length];
        findExactMatches();
        findNearMatches();
        findNoMatches();
        sortFeedback();
        return feedback;
      }

      public void findExactMatches() {
        for (int i = 0; i < guess.length; i++) {
          if (guess[i].equals(secretCode[i]) ) {
            feedback[i] = "b";
            guess[i] = "x";
            secretCode[i] = "x";
          }
        }
      }

      public void findNearMatches() {
        for (int i = 0; i < guess.length; i++) {
          if ( Arrays.asList(secretCode).contains(guess[i]) && !guess[i].equals("x") ) {
            feedback[i] = "w";
            int matched_symbol_index = Arrays.asList(secretCode).indexOf(guess[i]);
            secretCode[matched_symbol_index] = "x";
          }
        }
      }
于 2013-05-26T04:02:35.977 回答