java計算集合對稱差

本文簡單介紹下計算集合對稱差的幾種方法。java

maven

<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

在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

在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])

doc

相關文章
相關標籤/搜索