Guava Sets.difference#isEmpty() 行为
Guava Sets.difference#isEmpty() behaviour
我不明白 Guava 的 Sets 的行为#isEmpty() 方法的不同之处:
public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
checkNotNull(set1, "set1");
checkNotNull(set2, "set2");
final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
return new SetView<E>() {
@Override public Iterator<E> iterator() {
return Iterators.filter(set1.iterator(), notInSet2);
}
@Override public int size() {
return Iterators.size(iterator());
}
@Override public boolean isEmpty() {
return set2.containsAll(set1);
}
@Override public boolean contains(Object element) {
return set1.contains(element) && !set2.contains(element);
}
};
}
更准确地说,我不明白如何将 set2.containsAll(set1);
用作 isEmpty()
的结果。
举个例子:
- set1 = A,B
- set2 = A,B,C,D,E
差值(C,D,E)肯定不会为空。
但是 Sets.difference(set1, set2).isEmpty() 将 return 为真,因为 (A,B,C,D,E).containsAll(A,B) 为真。
即使 javadoc 这么说,我也不明白其中的逻辑:
{@code set2} may also contain elements not present in {@code set1}; these are simply ignored
我是不是记错了?我可以填写一个问题吗?
(我使用的是 guava-18.0)
来自"public static Sets.SetView difference(Set set1, Set set2)"的番石榴文档:
The returned set contains all elements that are contained by set1 and not contained by set2
如您所见,您的 set1 none 满足这些条件,因此差异集为空。
请注意,差异方法对于参数是不可交换的,差异集不是您在调用 difference(set1, set2);
时所想的那样 (C, D, E)
我不明白 Guava 的 Sets 的行为#isEmpty() 方法的不同之处:
public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
checkNotNull(set1, "set1");
checkNotNull(set2, "set2");
final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
return new SetView<E>() {
@Override public Iterator<E> iterator() {
return Iterators.filter(set1.iterator(), notInSet2);
}
@Override public int size() {
return Iterators.size(iterator());
}
@Override public boolean isEmpty() {
return set2.containsAll(set1);
}
@Override public boolean contains(Object element) {
return set1.contains(element) && !set2.contains(element);
}
};
}
更准确地说,我不明白如何将 set2.containsAll(set1);
用作 isEmpty()
的结果。
举个例子:
- set1 = A,B
- set2 = A,B,C,D,E
差值(C,D,E)肯定不会为空。 但是 Sets.difference(set1, set2).isEmpty() 将 return 为真,因为 (A,B,C,D,E).containsAll(A,B) 为真。
即使 javadoc 这么说,我也不明白其中的逻辑:
{@code set2} may also contain elements not present in {@code set1}; these are simply ignored
我是不是记错了?我可以填写一个问题吗?
(我使用的是 guava-18.0)
来自"public static Sets.SetView difference(Set set1, Set set2)"的番石榴文档:
The returned set contains all elements that are contained by set1 and not contained by set2
如您所见,您的 set1 none 满足这些条件,因此差异集为空。
请注意,差异方法对于参数是不可交换的,差异集不是您在调用 difference(set1, set2);