Почему мой код возвращает false при проверке между двумя одинаковыми строками?
Я пытаюсь создать класс поиска Palindrome, который использует ArrayStack символов, чтобы найти палиндромы в любом слове или фразе, переданной ему. Однако, когда я передаю палиндром в виде строки в мой код, он возвращает false.
Я несколько раз отлаживал свой код и даже переписал программу, но не могу понять, почему мой код не работает должным образом. Я думаю, что это может быть что-то простое, что я пропускаю в методе isPalindrome(), конструкторе или переменных экземпляра.
public class PalindromeFinder {
ArrayStack<Character> charStack = new ArrayStack<>();
String strVerify = "";
private String strCheck;
public PalindromeFinder(String strCheck) {
strCheck = strCheck.toLowerCase();
pushStr(strCheck);
strVerify = popStr();
}
public void pushStr(String strToPush) {
for (int chVal = 0; chVal <strToPush.length(); ++chVal) {
char ch = strToPush.charAt(chVal);
ch = Character.toLowerCase(ch);
if (Character.isAlphabetic(chVal)) {
charStack.push(ch);
}
}
}
public String popStr() {
while (!charStack.empty()) {
strVerify += charStack.pop();
}
return strVerify;
}
public boolean isPalindrome() {
return strVerify == strCheck;
}
}
Следующие строки кода возвращают false в основном методе моей программы:
PalindromeFinder p = новый PalindromeFinder("мама"); System.out.println (p.isPalindrome());
Любая помощь или улучшения в моем коде будет принята с благодарностью.
2 ответа
В PalindromeFinder
Конструктор вы никогда не назначаете strCheck
параметр к strCheck
поле, поэтому при сравнении поля в isPalindrome
, он по-прежнему имеет значение по умолчанию, null
, Вам нужна эта строка в конструкторе:
this.strCheck = strCheck;
Подумайте об объявлении поля как final
:
private final String strCheck;
Это имеет несколько небольших преимуществ для таких полей, которые не изменяются после строительства. Одним из таких преимуществ является то, что компилятор будет кричать на вас, если какой-либо конструктор забудет инициализировать поле, так что он поймал бы эту ошибку и спас бы путаницу.
Вы также должны сделать более позднее сравнение строк с equals
не ==
:
return strVerify.equals(strCheck);
PS PalindromeFinder
действительно не нужно быть классом. Это было бы проще, как один метод статической утилиты isPalindrome(String s)
Но все.
Вы должны сравнить строки в Java с помощью метода equals().
Ваш метод isPalindrome должен быть таким:
public boolean isPalindrome() {
return strVerify.equals(strCheck);
}