【问题标题】:Comparing List elements in java比较java中的List元素
【发布时间】:2013-03-21 18:42:48
【问题描述】:

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

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

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

两者都包含字符串对象。

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()));

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

【问题讨论】:

  • 请显示两个相同的字符串(不要忘记任何前导/尾随空格等)。
  • 还修剪()你的字符串...
  • 如果两者都是字符串,那么toString() 调用两者的意义何在。
  • 小心你的实际 if 检查token.get(i).toString() == chords.get(j).toString(),这将比较实际的对象引用而不是值。
  • 我建议打印字符串的长度,看看某处是否没有隐藏空间。

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    将该行更改为

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

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

    【讨论】:

    • 试过了。结果没有变化。
    • 很好。检查你的分词器,或者任何给你输入的东西。
    【解决方案3】:

    这将比较引用而不是值。

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

    你必须这样做:

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

    【讨论】:

      【解决方案4】:

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

      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);
          }
        }
      }
      

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • OP 表示列表包含字符串对象。 toString()String 对象将返回该对象的值。 equals 将使用字符串的值比较字符串,因此这段代码应该可以正常工作。
        • String 对象的 toString() 不返回哈希码。见docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
        • 是的,这是正确的,因为 String 类覆盖了默认的 toString() 实现,但通常大多数类不会,因此它们返回哈希码
        • 但这不适用于这里。
        猜你喜欢
        • 1970-01-01
        • 2021-07-31
        • 2018-03-24
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多