Что плохого в сравнении этих двух элементов из массива строк в Java?

Java новичок, и я застрял на чем-то, что кажется очень простым. Я написал алгоритм для игры, которую я создаю, и, используя TDD, все мои тесты проходят, но реальная игра не возвращает правильную обратную связь. Вместо этого всякий раз, когда я угадываю правильную букву, она возвращает "w" и должна возвращать "b".

Предыстория Игра начинается с генерации случайного кода из 4 символов. Цель игры состоит в том, чтобы ввести предположение и попытаться сопоставить секретный код. Класс обратной связи должен сообщать мне, является ли мое предположение горячим или холодным по сравнению с кодом.

Я передаю догадку и секретный код классу и вычисляю обратную связь. Предположение - это строка, которую я использую "split", чтобы превратить в массив String. Секретный код также является строковым массивом, для которого я случайно генерирую 4 различных строковых значения. Я попытался проверить, является ли один элемент из предположения и секретного кода строками, и получил "истину" для обоих.

Проблема Проблема в том, что мои точные совпадения, если оператор никогда не выполняется. Я прочитал, что вы должны использовать equals(), а также попробовал это, но получите ошибку.

Кто-нибудь может помочь?

Вот мой класс Feedback: открытый класс Feedback {

      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 ответа

Решение

При сравнении Strings, использовать equals вместо ==, String.equals будет сравнивать контент, пока == будет сравнивать личность (то есть, если это один и тот же объект или нет).

Так,

guess[i] == secretCode[i]

должно быть

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

Если вы хотите узнать больше, то вы могли бы сделать == если вы интернировали строку. Но это абсолютно бонусный контент.

Редактировать: А также, как johnchen902 сказал в комментарии:

И угадайте [i]!= "X" должно быть! Угадайте [i].equals("x"). (в findNearMatches())

Это 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")

Заменить guess[i] == secretCode[i] с guess[i].equals(secretCode[i]) и guess[i] != "x" с !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";
          }
        }
      }
Другие вопросы по тегам