为什么我的代码在两个相等字符串之间的检查中返回false



我正在尝试构建一个回文查找器类,该类使用字符的ArrayStack来查找传递给它的任何单词或短语中的回文。但是,当我将回文作为字符串传递给代码时,它会返回false。

我已经调试了好几次代码,甚至重新编写了程序,但我不明白为什么我的代码不能正常工作。我认为在isPalindome()方法、构造函数或实例变量中可能忽略了一些简单的东西。

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:

回文查找程序p=新的回文查找器("妈妈");System.out.println(p.isPalindome())

如果对我的代码有任何帮助或改进,我们将不胜感激。

PalindromeFinder构造函数中,您从未将strCheck参数分配给strCheck字段,因此当您比较isPalindrome中的字段时,它仍然具有默认值null。您需要在构造函数中使用以下行:

this.strCheck = strCheck;

考虑将字段声明为final:

private final String strCheck;

这对像这样在建设后不会改变的领域有一些小好处。其中一个好处是,如果任何构造函数忘记初始化字段,编译器都会对你大喊大叫,所以它会发现这个错误并避免混乱。

您还需要稍后使用equals而不是==:进行字符串比较

return strVerify.equals(strCheck);

p.S.PalindromeFinder实际上并不需要是一个类。作为一个单一的静态实用程序方法isPalindrome(String s),它会更简单,但无论如何。

您必须将Java中的字符串与equals()方法进行比较。

你的方法是回文应该是这样的:

public boolean isPalindrome() {
    return strVerify.equals(strCheck);
}

最新更新