问题陈述
我有两个相同类型的对象集合,我想进行比较。在这种情况下,我想根据一个属性进行比较,该属性不考虑对象的equals()
方法。在我的例子中,我使用了排名的名称集合。
public class Name {
private String name;
private int weightedRank;
//getters & setters
@Override
public boolean equals(Object obj) {
return this.name.equals(obj.name); //Naive implementation just to show
//equals is based on the name field.
}
}
我想比较这两个集合来断言,在每个集合的位置i,该位置上每个名称的weightedRank
值都相同。我搜索了一些资料,但在Commons Collections或任何其他API中都没有找到合适的方法,所以我想出了以下方法:
public <T> boolean comparatorEquals(Collection<T> col1, Collection<T> col2,
Comparator<T> c)
{
if (col1 == null)
return col2 == null;
if (col2 == null)
return false;
if (col1.size() != col2.size())
return false;
Iterator<T> i1 = col1.iterator(), i2 = col2.iterator();
while(i1.hasNext() && i2.hasNext()) {
if (c.compare(i1.next(), i2.next()) != 0) {
return false;
}
}
return true;
}
问题
还有其他方法可以做到这一点吗?我是否错过了Commons Collections中的明显方法?
相关
我还在SO上发现了this question,虽然在那种情况下,我认为覆盖equals()
更有意义。
编辑
类似于此的内容将很快进入Apache Commons Collections的发布版本(在撰写本文时)。请参见https://issues.apache.org/jira/browse/COLLECTIONS-446。
Equator
的东西(非常棒)似乎正在半实现中。我特别考虑了collections4和具体的CollectionUtils
:从我查看源代码来看,底部的方法使用了Equator
,但是顶部的更强大的方法(如disjunction
等)没有使用...你知道是否有人打算完成这项工作吗? - mike rodentCollectionUtils
中当前的CardinalityHelper
类依赖于使用Objects
自己的equals
方法。当您查看Collection.add()
时,例如,您会发现这不是由AbstractCollection
甚至不是由AbstractSet
或AbstractList
实现的:您必须等待具体类(例如ArrayList
)。因此,将Equator
纳入其中将意味着对CollectionUtils
进行大规模的重写。可惜,因为disjunction
和intersection
是该类中最棒的东西。 - mike rodent