我不理解Guava的集合的行为#isremp()方法的区别:
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()
的方式。
举个例子:
差异(C,D,E)肯定不会是空的。 但Sets.difference(set1,set2).isEmpty()将返回true,因为(A,B,C,D,E).containsAll(A,B)为真。
即使javadoc说,我也不明白逻辑:
{@ code set2}也可能包含{@code set1}中不存在的元素;这些都被忽略了
我错了吗?我要填一个问题吗?
(我正在使用guava-18.0)
答案 0 :(得分:6)
来自guava文档的“public static Sets.SetView difference(Set set1,Set set2)”:
返回的集合包含set1包含但未包含在set2
中的所有元素
如您所见,您的set1都不符合这些条件,因此差异设置为空。
请注意,差异方法对于参数不是可交换的,并且差异集不是(C,D,E),正如您在调用difference(set1, set2);