【问题标题】:Why does the contains() method in Java not work as expected?为什么 Java 中的 contains() 方法不能按预期工作?
【发布时间】:2018-11-15 00:42:58
【问题描述】:

我正在编写一个创建 ArrayList S_Comp 的方法,该方法包含数组 allNodes 中包含但未包含在 ArrayList solution 中的所有元素(其元素都包含在 allNodes )。当我打印solutionallNodes 时,我可以很容易地看到S_Comp 应该包含7 个元素。但是,allNodes 中的所有元素都将添加到 S_Comp 中,nodesS 中包含的元素也是如此。这里可能是什么问题?

您可以在下面找到我的方法代码。在调用该方法之前,S_Comp只被初始化为new ArrayList<MyNodesData>,所以它的大小为0。

public void generateSComp(DataFile testDataFile, ArrayList<Route> solution, ArrayList<MyNodesData> S_Comp)
    {
        System.out.println("solution: " + solution.toString());
        ArrayList<MyNodesData> nodesS = getNodesS(solution);
        System.out.println("NodesS: " + nodesS.toString());
        System.out.println("Size nodesS: " + nodesS.size());
        MyNodesData[] allNodes = testDataFile.getNodes();
        System.out.println("allNodes: " + Arrays.toString(allNodes));
        for(MyNodesData node : allNodes)
        {
            if(!nodesS.contains(node))
            {
                System.out.println(node.toShortString() + " is not in nodesS");
                S_Comp.add(node);
            }
        }

【问题讨论】:

  • MyNodesData 是否实现了 hashCode 和 equals?
  • @Michal 它没有,但是 .contains() 以前在 MyNodesData 上正常工作
  • @Mike 哦,天哪,我们的 3 个名字会让人很困惑……如果没有覆盖 equals,contains 正在使用引用相等。如果对象是具有相同字段的不同实例,则 contains 将返回 false。
  • 不覆盖equals,equals方法()比较引用(看看Object.class)。因此,只要您使用相同的对象,它就可以工作。如果您创建具有相同属性值的新对象,它将不再起作用
  • @Mike 不是没有这两种方法,它不会

标签: java arrays arraylist contains


【解决方案1】:

ArrayList javadoc 的 contains 方法请参考这里:https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#contains-java.lang.Object-

它说

公共布尔包含(对象o)

如果此列表包含指定元素,则返回 true。更多的 正式地,当且仅当 list 至少包含一个元素 e 使得 (o==null ? e==null : o.equals(e))。

所以它只有在你想要在 MyNodesData 类覆盖对象类的 equals 方法时才会起作用。此外,由于您可能已经知道 equals() 和 hashcode() 方法之间的约定,强烈建议将 hashcode() 与 equals() 一起覆盖

欲了解更多信息:Why do I need to override the equals and hashCode methods in Java?

【讨论】:

    【解决方案2】:

    覆盖 MyNodesData 类中的 hashcode 和 equals 方法,然后检查。

    【讨论】:

      【解决方案3】:

      contains 按预期工作,它会检查您传递的对象是否equals 列表中的对象。所以如果你没有得到预期的行为是因为这些对象不相等。

      您必须调试该代码以检查为什么 equals 没有返回您期望的结果。

      编辑:我读到您没有在 MyNodesData 类中覆盖 equals 和 hashcode,因此您应该按照其他人的建议进行操作

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 2012-07-24
        • 2015-01-28
        • 2020-09-14
        • 1970-01-01
        • 2012-09-15
        • 2021-02-09
        • 2012-06-19
        • 2021-05-30
        相关资源
        最近更新 更多