Что плохого в сравнении этих двух элементов из массива строк в 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 ответа
При сравнении String
s, использовать 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";
}
}
}