Почему мой код возвращает 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);
}
Другие вопросы по тегам