【发布时间】:2018-11-15 00:42:58
【问题描述】:
我正在编写一个创建 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);
}
}
【问题讨论】:
-
MyNodesData 是否实现了 hashCode 和 equals?
-
@Michal 它没有,但是 .contains() 以前在 MyNodesData 上正常工作
-
@Mike 哦,天哪,我们的 3 个名字会让人很困惑……如果没有覆盖 equals,
contains正在使用引用相等。如果对象是具有相同字段的不同实例,则contains将返回 false。 -
不覆盖equals,equals方法()比较引用(看看Object.class)。因此,只要您使用相同的对象,它就可以工作。如果您创建具有相同属性值的新对象,它将不再起作用
-
@Mike 不是没有这两种方法,它不会
标签: java arrays arraylist contains