65

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 セット操作コードのリポジトリとして使用できますか? この車輪は何度も再発明されたと思います。

4

4 に答える 4

109

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

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

于 2008-10-02T19:33:21.387 に答える
16

Google Guavaをお勧めします。Setsクラスはまさにあなたが探しているものを持っているようです。交差法と法があります。

このプレゼンテーションは、興味がある場合はおそらく見たいものです。これは、Guava の元の名前である Google Collections を指します。

于 2008-10-02T19:24:41.643 に答える
8

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

不変のバリアントの場合、Java 8でこれを行うことができます

引き算

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

交差点

set1
  .stream()
  .filter(item-> set2.contains(item))
  .collect(Collectors.toSet())
于 2015-12-23T16:24:06.760 に答える
7

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

于 2008-10-02T19:09:16.437 に答える