209

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

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

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

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

4

9 に答える 9

251

これを試して

test2.removeAll(test1);

Set#removeAll

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

于 2013-09-05T19:42:42.420 に答える
18

はい:

test2.removeAll(test1)

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

また、おそらく<Integer>代わりに<int>.

于 2013-09-05T19:42:36.147 に答える
15

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;
}
于 2018-09-11T04:54:19.750 に答える
1

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());
}
于 2013-09-05T19:43:57.567 に答える