当两个字符串打印相同的东西时,它们为什么不相等?

时间:2020-03-05 20:34:46

标签: java

这可能是一个愚蠢的问题,但老实说,我不知道我在做什么错。我创建了一个读取文件并打印其中每个单词的类。首先,我创建了一个名为“ lines”的类实例。我运行程序以查看lines.toString()打印什么,然后复制/粘贴结果。我将结果存储在一个名为“结果”的字符串变量中,然后比较了“结果”和“行”。

事实证明,lines.equals(result)是假的。为什么会这样?我只复制并粘贴结果,然后将其与原始结果进行比较。它们实际上是打印相同的内容,因此空白或类似内容不应有任何差异。我知道它有点长,但是如果您想看一下,我的代码在下面。我感谢任何能帮助我的人。谢谢!

public Document(String fileName) throws FileNotFoundException {
    File file;
    Scanner docScanner;

    String curLine;
    numLines = 0;
    numWords = 0;

    file = new File(fileName);
    docScanner = new Scanner(file);

    while (docScanner.hasNext()) {
        docScanner.nextLine();
        numLines++;
    }

    docScanner = new Scanner(file);
    words = new String[numLines][];

    for (int i = 0; i < words.length; i++) {
        curLine = docScanner.nextLine();
        words[i] = curLine.trim().split("\\s");

        if (words[i][0].equals("")) {
            words[i] = new String[0];
        } else {
            for (int j = 0; j < words[i].length; j++) {
                numWords++;
            }
        }
    }
}

public String getLine(int lineNum) throws NoSuchLineException {
    String result = "";
    for (int i = 0; i < words[lineNum].length; i++) {
        result = result + words[lineNum][i] + " ";
    }
    return result;  
}

public String toString() {
    String result = "";
    for (int i = 0; i < words.length; i++) {
        result = result + getLine(i) + "\n";
    }
    return result;
}

public static void main(String[] args) throws FileNotFoundException {
    Document lines = new Document("file.txt");

    String result = "Mary had \r\n" + 
            "a little lamb \r\n" + 
            "Its fleece was \r\n" + 
            "white \r\n" + 
            "as snow ";

    if (lines.toString().equals(result)) {
        System.out.println("They are equal");
    } else {
        System.out.println("Not equal");
    }
}

file.txt is below:
Mary had 
        a little lamb
Its fleece was 
    white 
as snow

2 个答案:

答案 0 :(得分:2)

if (lines.equals(result)) {

linesDocument,而resultString

所以它们不能相等。比较DocumentString就像比较apples and oranges

正如您所忽略提到的,我不知道Document是什么课程。

关于String,其equals方法需要一个相同类的对象。引用文档:

将此字符串与指定对象进行比较。当且仅当参数不为null并且是一个true对象,该对象表示与此对象相同的字符序列时,结果为String

答案 1 :(得分:0)

根据评论部分的建议:重写我的评论作为答案。

问题的原因似乎在于toString方法的内部实现:

for (int i = 0; i < words.length; i++) {
    result = result + getLine(i) + "\n";
}

无论循环中间还是最后一行,总是添加换行符,而测试字符串在最后一行缺少换行符。

考虑到这一点,for循环可能类似于:

public String toString() {
    String result = "";
    for (int i = 0; i < words.length - 1; i++) {
        result = result + getLine(i)+"\r\n";
    }
    return result + getLine(words.length - 1);
}

请注意,我还将unix行\n更改为与示例中的\r\n字符串中使用的等效于Windows的result,因为它们不相等。

在大多数情况下,最好使用System.lineSeparator()方法而不是在字符串中手动写入分隔符,因为在各种情况下,如果使用错误的字符串,则可能会在不同的系统上错误地显示字符串。

我的循环版本当然可以进一步改善,例如通过引入变量来代替words.length - 1,以提高可读性,更重要的是:使用StringBuilder实例是在循环开始之前初始化的循环而不是字符串进行串联。