Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用自定义相等函数检查两个集合是否相同(忽略顺序)_Java_Guava_Equality - Fatal编程技术网

Java 使用自定义相等函数检查两个集合是否相同(忽略顺序)

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()); } }; 现在我需要检查我的两

我有两个收藏的Foo。我不能更改Foo的实现,Foo的equals函数实现不正确。我也不能继承福的遗产。我使用自定义相等函数:我使用guava的谓词函数实现。让您了解一下,实现看起来有点像这样

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()