比较Java中的两个集合

我在Java类中有两个集合。第一个集合包含先前的数据,第二个集合包含来自前一个集合的更新数据。

我想比较两个集合,但我不确定有效实现它的最佳方法。两个集合将包含相同数量的项目。

然后基于carType在每个集合中是相同的,我想执行carType方法。

任何帮助表示赞赏

很难提供帮助,因为您没有告诉我们您希望如何比较(等大小)集合。 一些想法,希望一个适合:

比较两个集合,如果它们包含相同顺序的相同对象

Iterator targetIt = target.iterator(); for (Object obj:source) if (!obj.equals(targetIt.next())) // compare result -> false 

如果它们在任何顺序中包含相同的对象,则比较它们

 for (Object obj:source) if (target.contains(obj)) // compare result -> false 

查找已更改的其他集合中的元素

 Iterator targetIt = target.iterator(); for (Object obj:source) if (!obj.equals(targetIt.next()) // Element has changed 

根据你的评论,这个算法会做到这一点。 它收集所有已更新的汽车。 如果方法结果是空列表,则两个集合包含相同顺序的相同条目。 该算法依赖Car类型上equals()的正确实现!

 public List findUpdatedCars(Collection oldCars, Collection newCars) List updatedCars = new ArrayList(); Iterator oldIt = oldCars.iterator(); for (Car newCar:newCars) { if (!newCar.equals(oldIt.next()) { updatedCars.add(newCar); } } return updatedCars; } 

从集合算术中,集合A和B是相等的iff A subsetequal B和B subsetequal A.因此,在Java中,给定两个集合A和B,您可以检查它们的相等性而不考虑元素的顺序

 boolean collectionsAreEqual = A.containsAll(B) && B.containsAll(A); 
  • 迭代第一个集合并将其添加到Map ,其中Entity是存储在集合中的类, Integer表示它发生的次数。
  • 迭代第二个集合,并为每个元素尝试在Map查找它 – 如果它存在,则将Integer值减1,并在找到匹配项时执行任何必要的操作。 如果Integer值已达到零,则从地图中删除(Entity,Integer)条目。

假设您已经实现了有效的hashCode()方法,该算法将以线性时间运行。

稍微更新一个考虑空值:

 static  boolean equals(Collection lhs, Collection rhs) { boolean equals = false; if(lhs!=null && rhs!=null) { equals = lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs) && rhs.containsAll(lhs); } else if (lhs==null && rhs==null) { equals = true; } return equals; } 

如果不担心像(2,2,3),(2,3,3)这样的情况:

 static  boolean equals(Collection lhs, Collection rhs) { return lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs) && rhs.containsAll(lhs); }