web-dev-qa-db-ja.com

2つのセットの違いを取得する

したがって、2つのセットがある場合:

Set<int> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);

Set<int> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);

それらを比較し、4と5のセットのみを返す方法はありますか?

122
David Tunnell

これを試して

test2.removeAll(test1);

Set#removeAll

このセットから、指定されたコレクションに含まれるすべての要素を削除します(任意の操作)。指定されたコレクションもセットである場合、この操作はこのセットを効果的に変更して、その値が2つのセットの非対称セットの差になるようにします。

159
Prabhaker

Guava(以前のGoogle Collections)ライブラリを使用する場合、解決策があります。

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);

返されるSetViewSetであり、不変にするか別のセットにコピーできるライブ表現です。 test1test2はそのまま残ります。

97

はい:

test2.removeAll(test1)

これによりtest2が変更されますが、保持する必要がある場合はコピーを作成してください。

また、おそらく<Integer>の代わりに<int>を意味していました。

13
arshajii

Java 8

removeIf を使用できます。これは、ユーティリティメソッドを次のように記述する述語を取ります。

// computes the difference without modifying the sets
public static <T> Set<T> differenceJava8(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeIf(setTwo::contains);
     return result;
}

また、以前のバージョンを使用している場合は、removeAllを次のように使用できます。

public static <T> Set<T> difference(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeAll(setTwo);
     return result;
}
4
i_am_zero

Java 8を使用している場合、次のようなものを試すことができます。

public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){
    final Set<Number> larger = set1.size() > set2.size() ? set1 : set2;
    final Set<Number> smaller = larger.equals(set1) ? set2 : set1;
    return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet());
}
4
Josh M

CollectionUtils.disjunctionを使用してすべての違いを取得するか、CollectionUtils.subtractを使用して最初のコレクションの違いを取得できます。

これを行う方法の例を次に示します。

    var collection1 = List.of(1, 2, 3, 4, 5);
    var collection2 = List.of(2, 3, 5, 6);
    System.out.println(StringUtils.join(collection1, " , "));
    System.out.println(StringUtils.join(collection2, " , "));
    System.out.println(StringUtils.join(CollectionUtils.subtract(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.retainAll(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.collate(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.disjunction(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.intersection(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.union(collection1, collection2), " , "));
2
pwipo