序
本文簡單介紹下計算集合對稱差的幾種方法。
maven
1
2
3
4
5
6
7
8
9
10
|
< 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}。
guava
在guava里頭是用symmetricDifference方法
1
2
3
4
|
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
在collection4里頭是用disjunction方法
1
2
3
4
|
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中的方法來獲取:
1
2
3
4
5
6
7
8
9
10
11
12
|
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); } |
實例
1
2
3
|
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())); |
輸出
([bbb, dddd],[zzz])
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000010954970