web-dev-qa-db-ja.com

Java.util.Collectionの古典的な集合演算

Java.util.Collectionクラスの古典的なセット操作のための組み込み機能はありますか?私の特定の実装はArrayListになりますが、これはCollectionのすべてのサブクラスに適用すべきもののように聞こえます。私は次のようなものを探しています:

ArrayList<Integer> setA ...
ArrayList<Integer> setB ...
ArrayList<Integer> setAintersectionB = setA.intersection(setB);
ArrayList<Integer> setAminusB = setA.subtract(setB);

いくつかの検索の後、私は自家製のソリューションを見つけることができました。また、「セット」の概念と「コレクション」の概念を混同している可能性がありますが、それぞれ重複を許可したり許可したりすることはできません。おそらく、これは本当にSetインターフェイスの単なる機能ですか?

組み込みの機能を誰も知らない場合は、おそらくこれを標準プラクティスのリポジトリとして使用できますJava set operation code?このホイールは何度も再発明されたと思います。

62
Ross

交差はCollection.retainAllで行われます; Collection.removeAllによる減算。 Collection.addAllとの結合。いずれの場合も、Setはセットのように機能し、Listはリストのように機能します。

可変オブジェクトとして、それらは適切に動作します。元の可変オブジェクトを変更せずに保持する場合は、明示的にコピーする必要があります。

108

Google Guava をお勧めします。 Sets クラスは、まさにあなたが探しているものを持っているようです。 intersection メソッドと difference メソッドがあります。

このプレゼンテーション は、おそらく興味があるなら見たいものです。グアバの元の名前であるGoogleコレクションを指します。

15
Benno Richters

Java.util.Set インターフェイス(およびその実装HashSetとTreeSet(ソート済み))を探していますか?
このインターフェースは、substract()のように見えるremoveAll(Collection c)と、交差点のように見えるretainAll(Collection c)を定義しています。

7
PhiLho

変更可能な操作については、受け入れられた回答を参照してください。

不変のバリアントの場合、Java 8

引き算

set1
  .stream()
  .filter(item-> !set2.contains(item))
  .collect(Collectors.toSet())

交差点

set1
  .stream()
  .filter(item-> set2.contains(item))
  .collect(Collectors.toSet())
7
mhstnsc