本文簡單介紹下計算集合對稱差的幾種方法。java
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.1</version> </dependency>
兩個集合的對稱差是隻屬於其中一個集合,而不屬於另外一個集合的元素組成的集合。
集合A和B的對稱差一般表示爲AΔB,對稱差的符號在有些圖論書籍中也使用符號⊕來表示。例如:集合{1,2,3}和{3,4}的對稱差爲{1,2,4}。apache
在guava裏頭是用symmetricDifference方法segmentfault
Set<Integer> a = new HashSet<>(Arrays.asList(1, 2, 3, 4)); Set<Integer> b = new HashSet<>(Arrays.asList(3, 4, 5, 6)); Sets.SetView<Integer> result = Sets.symmetricDifference(a,b); System.out.println(result);
在collection4裏頭是用disjunction方法maven
Set<Integer> a = new HashSet<>(Arrays.asList(1, 2, 5)); Set<Integer> b = new HashSet<>(Arrays.asList(1, 2, 3)); SetUtils.SetView<Integer> result = SetUtils.disjunction(a, b); assertTrue(result.toSet().contains(5) && result.toSet().contains(3));
上述的兩個方法都不能標註哪些元素屬於第一個集合,哪一個屬於第二個集合,有時候咱們又想獲取對稱差的時候順便可以計算出哪一個元素屬於哪一個集合,這個時候怎麼辦呢,能夠模仿collection4中的方法來獲取:google
public static <O> Pair<Collection<O>,Collection<O>> disjunction2(final Collection<? extends O> first, final Collection<? extends O> second, final Predicate<O> p) { final List<O> firstList = first.stream() .filter(e -> p.evaluate(e)) .collect(Collectors.toList()); final List<O> secondList = second.stream() .filter(e -> !firstList.remove(e)) .collect(Collectors.toList()); return Pair.of(firstList,secondList); }
實例lua
final List<String> first = Arrays.asList("bbb", "ccc","dddd","aaa"); final List<String> second = Arrays.asList("aaa", "zzz", "ccc"); System.out.println(disjunction(first,second,TruePredicate.truePredicate()));
輸出code
([bbb, dddd],[zzz])