为什么 Java 中的 contains() 方法没有按预期工作?
Why does the contains() method in Java not work as expected?
我正在编写一个创建 ArrayList S_Comp
的方法,其中包含数组 allNodes
中包含但不包含在 ArrayList solution
中的所有元素(其元素都包含在 allNodes
中)。当我打印 solution
和 allNodes
时,我可以很容易地看到 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);
}
}
contains 按预期工作,它将检查您传递的对象是否 equals
列表中的对象。所以如果你没有得到预期的行为是因为这些对象不相等。
您必须调试该代码以检查为什么 equals 没有返回您期望的结果。
编辑:我读到您没有覆盖 MyNodesData 中的 equals 和 hashcode class,所以您应该按照其他人的建议去做
覆盖 MyNodesData 中的 hashcode 和 equals 方法 class 然后检查。
ArrayList javadoc的contains方法参考这里:https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#contains-java.lang.Object-
它说
public boolean contains(Object o)
Returns true if this list contains the specified element. More
formally, returns true if and only if this
list contains at least one element e such that (o==null ? e==null :
o.equals(e)).
所以它只有在你 重写对象 Class 的 equals 方法时才有效 in MyNodesData class.此外,由于您可能已经知道 equals() 和 hashcode() 方法之间的约定,因此 强烈建议将 hashcode() 与 equals().
一起覆盖
更多信息:Why do I need to override the equals and hashCode methods in Java?
我正在编写一个创建 ArrayList S_Comp
的方法,其中包含数组 allNodes
中包含但不包含在 ArrayList solution
中的所有元素(其元素都包含在 allNodes
中)。当我打印 solution
和 allNodes
时,我可以很容易地看到 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);
}
}
contains 按预期工作,它将检查您传递的对象是否 equals
列表中的对象。所以如果你没有得到预期的行为是因为这些对象不相等。
您必须调试该代码以检查为什么 equals 没有返回您期望的结果。
编辑:我读到您没有覆盖 MyNodesData 中的 equals 和 hashcode class,所以您应该按照其他人的建议去做
覆盖 MyNodesData 中的 hashcode 和 equals 方法 class 然后检查。
ArrayList javadoc的contains方法参考这里:https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#contains-java.lang.Object-
它说
public boolean contains(Object o)
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
所以它只有在你 重写对象 Class 的 equals 方法时才有效 in MyNodesData class.此外,由于您可能已经知道 equals() 和 hashcode() 方法之间的约定,因此 强烈建议将 hashcode() 与 equals().
一起覆盖更多信息:Why do I need to override the equals and hashCode methods in Java?