这可能是一个愚蠢的问题,但老实说,我不知道我在做什么错。我创建了一个读取文件并打印其中每个单词的类。首先,我创建了一个名为“ 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
答案 0 :(得分:2)
if (lines.equals(result)) {
lines
是Document
,而result
是String
。
所以它们不能相等。比较Document
和String
就像比较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
实例是在循环开始之前初始化的循环而不是字符串进行串联。