Java 使用自定义相等函数检查两个集合是否相同(忽略顺序)
我有两个收藏的Foo。我不能更改Foo的实现,Foo的equals函数实现不正确。我也不能继承福的遗产。我使用自定义相等函数:我使用guava的谓词函数实现。让您了解一下,实现看起来有点像这样Java 使用自定义相等函数检查两个集合是否相同(忽略顺序),java,guava,equality,Java,Guava,Equality,我有两个收藏的Foo。我不能更改Foo的实现,Foo的equals函数实现不正确。我也不能继承福的遗产。我使用自定义相等函数:我使用guava的谓词函数实现。让您了解一下,实现看起来有点像这样 new谓词(){ @凌驾 公共布尔应用(@Nullable Pair input){ Foo one=input.getFirst(); Foo two=input.getSecond(); 返回Objects.equals(一个.getId(),两个.getId()); } }; 现在我需要检查我的两
new谓词(){
@凌驾
公共布尔应用(@Nullable Pair input){
Foo one=input.getFirst();
Foo two=input.getSecond();
返回Objects.equals(一个.getId(),两个.getId());
}
};
现在我需要检查我的两个Foo集合是否包含相同的项目忽略订单
我正在寻找使用这个自定义相等函数来实现这一点的最佳方法。为什么不使用带有自定义
比较器的简单SortedSet
Comparator<Foo> comparator = new Comparator<Foo>() {
public int compare(Foo o1, Foo o2) {
return //your custom comparison
}
};
SortedSet<Foo> sortedSet1 = newTreeSet(comparator);
sortedSet1.addAll(firstCollection);
SortedSet<Foo> sortedSet2 = newTreeSet(comparator);
sortedSet2.addAll(secondCollection);
sortedSet1.equals(sortedSet); //this is what you want
比较器比较器=新比较器(){
公共整数比较(Foo o1,Foo o2){
return//您的自定义比较
}
};
SortedSet sortedSet1=新树集(比较器);
sortedSet1.addAll(首次收集);
SortedSet sortedSet2=新树集(比较器);
sortedSet2.addAll(第二次收集);
sortedSet1.等于(sortedSet)//这就是你想要的
如果您不想在操作后拥有已排序的列表,请复制它或使用带有集的answer(但带有集的[1,1,1]==[1])
公共类列表测试{
公共静态void main(字符串[]args){
list1=Arrays.asList(1,2,3,4,5);
list2=Arrays.asList(1,2,3,4,5);
list3=Arrays.asList(1,2,3,4,4);
println(比较(列表1,列表2,(a,b)->a-b));
println(比较(列表1,列表3,(a,b)->a-b));
}
私有静态布尔比较(列表列表1、列表列表2、比较器比较器){
如果(list1.size()!=list2.size()){
返回false;
}
Collections.sort(列表1,comparator);
Collections.sort(列表2,comparator);
迭代器迭代器1=list1.Iterator();
迭代器迭代器2=list2.Iterator();
while(iterator1.hasNext()){
if(comparator.compare(迭代器1.next(),迭代器2.next())!=0){
返回false;
}
}
返回true;
}
}
你可以用番石榴包装你的课程,并将其存储在集合中
Equivalence<Foo> eq = new Equivalence<Foo>{
// implement equals and hashcode
};
Set<Equivalence<Foo>> set1 = new HashSet<>();
set1.add(eq.wrap(someFoo));
你能用集合代替吗?否则,您可以检查list2是否包含list1中的所有项,反之亦然。我知道的Set的任何实现都使用equals函数实现相等。如果有一个set的实现,您可以定义一个自定义的相等函数,如我所拥有的(或类似的),那么这将是一个很好的解决方案。虽然从技术上来说,这应该是可行的,但它违反了Comparator的约定,即当两个对象相等时返回0。哦,这个等价类看起来非常有希望:)
Equivalence<Foo> eq = new Equivalence<Foo>{
// implement equals and hashcode
};
Set<Equivalence<Foo>> set1 = new HashSet<>();
set1.add(eq.wrap(someFoo));
Sets.difference(set1, set2).isEmpty()