从Java中的字符串数组比较这两个元素有什么问题?

时间:2013-05-26 03:57:20

标签: java arrays string comparison

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

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

我将猜测和密码传递给班级并计算反馈。猜测是我使用的字符串" split"变成一个String数组。密码也是一个字符串数组,我随机生成4个不同的字符串值。我试着检查猜测和密码中的一个元素是否是字符串并得到" true"双方。

问题 问题是我的确切匹配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);
      }
    }

3 个答案:

答案 0 :(得分:3)

比较String时,请使用equals代替==String.equals会对内容进行比较,而==会比较身份(即如果它们是同一个对象)。

所以,

guess[i] == secretCode[i]

应该是

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

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

编辑:还有,正如johnchen902在评论中所说:

  

猜猜[i]!=“x”应该是!猜[i] .equals(“x”)。 (在findNearMatches()中)

答案 1 :(得分: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")

答案 2 :(得分:3)

guess[i] == secretCode[i]替换为guess[i].equals(secretCode[i]),将guess[i] != "x"替换为!guess[i].equals("x")

==测试参考相等性。

.equals()测试价值平等。

您可以找到更多信息here

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";
          }
        }
      }