1

我有 2 个列表标记和和弦。他们人口充足。但是当我尝试比较 2 时,尽管在循环中单独打印时打印相同的字符串内容,它们总是会产生错误值。有什么想法/解决方法吗?

System.out.println(token.get(i).toString().equals(chords.get(j).toString()));

两者都声明为 List 并初始化为 ArrayList();

两者都包含 String 对象。

while (i < tokenLength) {
    System.out.println("");
    int j = 0;
    while (j < numberOfChords) {
        System.out.println(token.get(i).toString() + " compares "
                + chords.get(j).toString());
        System.out.println(token.get(i).toString()
                .equals(chords.get(j).toString()));
        if (token.get(i).toString() == chords.get(j).toString()
                && token.get(i).toString().length() <= maxLengthOfChord) {

            foundChord.add(token.get(i));
        }
        j++;
    }
    i++;
}

给出以下输出: 在此处输入图像描述

我也试过这个

System.out.println(token.get(i).toString().equals(chords.get(j).toString()));

它总是产生一个错误,返回相同的结果,如屏幕截图所示

4

5 回答 5

2

到目前为止,您所做的一切都是正确的:

if (token.get(i).toString() == chords.get(j).toString()

您需要使用该equals方法,而不是==

于 2013-03-21T18:57:46.617 回答
1

这将比较引用而不是值。

token.get(i).toString() == chords.get(j).toString()

你所要做的:

token.get(i).toString().equals(chords.get(j).toString())
于 2013-03-21T18:58:38.460 回答
1

不能说为什么它打印错误,但这绝对是错误的:

    if (token.get(i).toString() == chords.get(j).toString()

将该行更改为

    if (token.get(i).trim().equals(chords.get(j).trim())

平等 (equals()) 与身份 (==) 不同。

于 2013-03-21T18:57:33.410 回答
1

我不确定您当前的代码到底有什么问题,但是我帮您简化了一点……

for (String t : token) {
  for (String c : chords) {
    System.out.println(t + " compares " + c);
    System.out.println(t.equals(c));
    if (t.equals(c)) {
      foundChord.add(t);
    }
  }
}

如果我理解正确,那么您应该执行当前代码试图实现的目标,并且它应该可以正常工作。

于 2013-03-21T19:09:10.053 回答
0

toString() 将默认打印对象的哈希码。哈希码对于所有对象都是唯一的,因此它永远不会与其他对象的哈希码匹配,并且当您比较它们时结果是错误的(即使对象相似)。您需要重写 toString() 方法以获得预期的结果。也许您可以从 toString 方法返回实例变量的值

于 2013-03-21T18:47:01.937 回答