【问题标题】:Guava Sets.difference#isEmpty() behaviourGuava Sets.difference#isEmpty() 行为
【发布时间】:2015-12-31 17:27:35
【问题描述】:

我不明白 Guava 的 Sets#difference 关于 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() 将返回 true,因为 (A,B,C,D,E).containsAll(A,B) 为 true。

即使 javadoc 这么说,我也不明白其中的逻辑:

{@code set2} 也可能包含 {@code set1} 中不存在的元素;这些都被忽略了

我错了吗?我要填一个问题吗?

(我使用的是 guava-18.0)

【问题讨论】:

    标签: java set guava is-empty


    【解决方案1】:

    来自“public static Sets.SetView差异(Set set1, Set set2)”的番石榴文档:

    返回的集合包含了set1包含的和set2不包含的所有元素

    如您所见,您的 set1 均不符合这些条件,因此差异集为空。

    请注意,差异方法对于参数是不可交换的,并且差异集不是您调用difference(set1, set2);时所想的(C,D,E)

    【讨论】:

    • 确实,我期待像Sets.symmetricDifference 这样的行为。感谢您的回复。
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多