比较Java中的两个集合

时间:2010-11-03 08:50:07

标签: java collections

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

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

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

感谢任何帮助

7 个答案:

答案 0 :(得分:25)

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

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

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

根据您的评论,此算法可以执行此操作。它收集所有已更新的汽车。如果方法结果是空列表,则两个集合包含相同顺序的相同条目。算法依赖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;
}

答案 1 :(得分:9)

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

boolean collectionsAreEqual = A.containsAll(B) && B.containsAll(A);

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

稍微更新一个考虑空值:

static <T> boolean equals(Collection<T> lhs, Collection<T> 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;
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

public static boolean isEqualCollection(java.util.Collection a,
                                        java.util.Collection b)

如果给定的Collections包含具有完全相同基数的完全相同元素,则返回true。

也就是说,对于a或b中的每个元素e,如果a中e的基数等于b中e的基数。

参数

  • 第一个集合,不能为空
  • 第二 集合,不能为空

返回: 如果集合包含具有相同基数的相同元素,则为true。

答案 6 :(得分:-2)

return collection1.toString().equals(collection2.toString());