比较Java中的两个集合

dam*_*535 11 java collections

我在Java类中有两个集合.第一个集合包含以前的数据,第二个集合包含前一个集合中的更新数据.

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

然后根据我想要执行carType方法的每个集合中的carType相同.

任何帮助表示赞赏

And*_*s_D 26

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

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

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

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

for (Object obj:source)
  if (target.contains(obj))
    // compare result -> false
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @ damien535:请记住,要使其正常工作,您必须覆盖`Car`对象中的`hashCode()`和`equals()` (3认同)

Red*_*III 11

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

boolean collectionsAreEqual = A.containsAll(B) && B.containsAll(A);
Run Code Online (Sandbox Code Playgroud)

  • 此语句对集合适用,但对允许重复条目的列表或其他结构可能不适用(换句话说,请尽可能使用集合简化逻辑) (3认同)

Ada*_*ski 6

  • 迭代第一个集合并将其添加到a中Map<Entity, Integer>,Entity即存储在集合中的类,它Integer表示它发生的次数.
  • 迭代第二个集合,并为每个元素尝试查找Map- 如果存在,则将Integer值减1,并在找到匹配时执行任何必要的操作.如果该Integer值已达到零,则从地图中删除(Entity,Integer)条目.

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