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?このホイールは何度も再発明されたと思います。
交差はCollection.retainAll
で行われます; Collection.removeAll
による減算。 Collection.addAll
との結合。いずれの場合も、Set
はセットのように機能し、List
はリストのように機能します。
可変オブジェクトとして、それらは適切に動作します。元の可変オブジェクトを変更せずに保持する場合は、明示的にコピーする必要があります。
Google Guava をお勧めします。 Sets クラスは、まさにあなたが探しているものを持っているようです。 intersection メソッドと difference メソッドがあります。
このプレゼンテーション は、おそらく興味があるなら見たいものです。グアバの元の名前であるGoogleコレクションを指します。
Java.util.Set インターフェイス(およびその実装HashSetとTreeSet(ソート済み))を探していますか?
このインターフェースは、substract()のように見えるremoveAll(Collection c)と、交差点のように見えるretainAll(Collection c)を定義しています。
変更可能な操作については、受け入れられた回答を参照してください。
不変のバリアントの場合、Java 8
引き算
set1
.stream()
.filter(item-> !set2.contains(item))
.collect(Collectors.toSet())
交差点
set1
.stream()
.filter(item-> set2.contains(item))
.collect(Collectors.toSet())