2

Cは型のコレクションでありSet<T>、F(x)はSetのコレクションを返します。私がやりたいのは、和集合、共通部分、差などの集合間の演算を実行することです。

// C union ( F(X) \ F(Y))
C.addAll( F(X).removeAll( F(Y)))); //error boolean because removeAll returns a boolean

代わりに私はできた

C_aux = new HashSet<T> ( F(X));
C_aux.removeAll( F(Y)); 
C.addAll( C_aux);

とにかく、補助コレクションを宣言せずにこれを行うには?(ブール値の戻りをスキップ/無視します)

4

2 に答える 2

6

java.util.Collection API:

a.retainAll(b); // intersection
a.removeAll(b); // difference
a.addAll(b); // union

Google Guava com.google.common.collect.Sets API:

Sets.union(a, b);
Sets.intersection(a, b);
Sets.difference(a, b);

それが実際に必要なものである場合は、ワンライナーを書くことができます。

Sets.union(C, Sets.difference(F(X), F(Y)))

ただし、結果セットは読み取り専用であることに注意してください。したがって、実際のセットを使用する必要がある場合は、C.removeAll代わりに

于 2012-11-30T16:05:38.737 に答える
2

どうですか

C.addAll(A.removeAll(B)?A:A);

通常、これは冗談だと思いますが、この場合はリストの作成を節約できます。約3ヶ月間水をやるのを忘れた後も、私の「観賞用」植物と同じくらい醜いです...:P

編集:これももちろん機能しますが、それでもAを変更します。

A.removeAll(B);
C.addAll(A);

ちなみに、メソッドでとを変更できない場合AB、一時リストを作成する方法はないと思います(変数で安全にするかどうかは関係ありません)。少なくとも、C最初に要素を含めることができる場合。

于 2012-11-30T15:55:21.030 に答える