【问题标题】:Why is my code returning false in a check between two equal strings? [duplicate]为什么我的代码在检查两个相等的字符串时返回 false? [复制]
【发布时间】:2016-01-30 02:48:21
【问题描述】:

我正在尝试构建一个回文查找器类,该类使用 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;
    }
}

以下代码行在我的程序的 main 方法中返回 false:

PalindromeFinder p = new PalindromeFinder("mom"); System.out.println(p.isPalindrome());

对我的代码的任何帮助或改进将不胜感激。

【问题讨论】:

  • return strVerify.equals(strCheck);....字符串是对象而不是变量,因此您可以按照自己的方式比较地址
  • 对我来说仍然返回 false,我刚刚尝试过。
  • 返回 strVerify.equalsIgnoreCase(strCheck); ?
  • 仍然不起作用,它必须是未返回正确结果的变量之一。
  • 然后只需给出 vie system.out.println() 两个字符串中的内容;)

标签: java oop methods constructor instance-variables


【解决方案1】:

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

this.strCheck = strCheck;

考虑将字段声明为final:

private final String strCheck;

这对于像这样在构建后不会改变的字段有一些小好处。其中一个好处是,如果任何构造函数忘记初始化字段,编译器就会对你大喊大叫,因此它会捕捉到这个错误并避免混乱。

你还需要与equals进行后面的字符串比较,而不是==:

return strVerify.equals(strCheck);

附: PalindromeFinder 并不需要成为一个班级。作为单个静态实用程序方法isPalindrome(String s) 会更简单,但无论如何。

【讨论】:

  • 我自己解决了。谢谢。我更改了 pushStr() 方法中的 if 语句。在使用 ArrayStacks 时,我如何使它成为一个单一的静态实用程序方法?
  • @kof_ 这没有什么诀窍;只需将回文代码放在一种方法中即可。
【解决方案2】:

您必须在 Java 中使用 equals() 方法比较字符串。

你的方法 isPalindrome 应该是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多