为什么Java中的contains()方法不能按预期工作?

时间:2018-06-05 13:40:34

标签: java arrays arraylist contains

我正在编写一个方法来创建一个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);
            }
        }

3 个答案:

答案 0 :(得分:2)

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

它说

  

public boolean contains(Object o)

     

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

因此,只有在覆盖等于对象类的方法时,它才会起作用,因为您希望在MyNodesData类中使用 。此外,由于您可能已经知道equals()和hashcode()方法之间的契约,因此强烈建议覆盖hashcode()以及equals()

有关详细信息:Why do I need to override the equals and hashCode methods in Java?

答案 1 :(得分:0)

包含与预期一样的工作,它将检查您传递的对象equals列表中的对象。因此,如果你没有得到预期的行为是因为那些对象不相等。

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

编辑:我读到你没有覆盖MyNodesData类中的equals和hashcode,所以你应该像其他人一样建议

答案 2 :(得分:0)

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