我有一个Java类中的两个集合。第一个集合包含之前的数据,第二个集合包含来自先前集合的更新数据。
我想比较这两个集合,但不确定最有效的实现方式。两个集合将包含相同数量的项目。
然后根据每个集合中的carType是否相同,我想执行carType方法。
感谢任何帮助。
我有一个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<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;
}
new
,这是不允许的。另外,在 findUpdatedCars
中,这个 new
是在哪里使用的? - Shervin AsgariCar
对象中覆盖hashCode()
和equals()
方法。 - Shervin Asgari从集合论来看,如果A包含于B且B包含于A,则集合A和B相等。因此,在Java中,给定两个集合A和B,您可以使用以下方法检查它们是否相等(无需考虑元素的顺序):
boolean collectionsAreEqual = A.containsAll(B) && B.containsAll(A);
Map<Entity,Integer>
中,其中Entity
是存储在您的集合中的类,而Integer
表示它出现的次数。Map
中查找-如果存在,则将Integer
值减一,并在找到匹配项时执行任何必要的操作。 如果Integer
值已达到零,则从地图中删除(实体,整数)条目。假设您已经实现了有效的hashCode()
方法,此算法将以线性时间运行。
稍微更新了一下,考虑到了 null 值:
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;
}
static <T> boolean equals(Collection<T> lhs, Collection<T> rhs) {
return lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs) && rhs.containsAll(lhs);
}
public static boolean isEqualCollection(java.util.Collection a,
java.util.Collection b)
如果给定的集合包含完全相同的元素和基数,则返回true。
也就是说,对于a或b中的每个元素e,当且仅当e在a中的基数等于e在b中的基数时。
参数:
返回值: 如果集合包含相同的元素和基数,则返回true。