2015-12-31 3 views
4

Я не понимаю поведение Sets # разницы гуавы в о IsEmpty() метод:гуава 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 = А, В
  • SET2 = А, В, С, D, Е

разность (С, D, Е), безусловно, не быть пустым. Но Sets.difference (set1, set2) .isEmpty() вернет true как (A, B, C, D, E) .containsAll (A, B) истинно.

Даже если Javadoc говорит, что я не понимаю логику:

{@code set2} может также содержать элементы, которые не представляют в {@code set1}; они просто игнорируются

Я принимаю? Должен ли я заполнить вопрос?

(я использую гуавы-18,0)

ответ

6

Из гуавы документации "разностью общественного статического Sets.SetView (Set set1, Set set2)":

Возвращаемый набор содержит все элементы которые содержатся в set1 и не содержатся в set2

Как вы можете видеть, ни один из ваших наборов1 не отвечает этим критериям, поэтому набор различий пуст.

Обратите внимание, что разностный метод не является коммутативной для аргументов и разностное множество не является (C, D, E), как вы думаете, когда вы звоните difference(set1, set2);

+4

Действительно, я ожидал, что поведение таких как 'Sets. symmetricDifference'. Спасибо за ваш ответ. – Arno

Смежные вопросы