23

デモ(結果を期待し[3]ます):

[1,2] - [1,2,3] => []    # Hmm
[1,2,3] - [1,2] => [3]   # I see

a = [1,2].to_set   => #<Set: {1, 2}>
b = [1,2,3].to_set => #<Set: {1, 2, 3}>
a - b              => #<Set: {}>  WTF!

と:

[1,2,9] - [1,2,3] => [9]  # Hmm. Would like [[9],[3]]

入力の順序に関係なく、実際のセットの違いを実行するにはどうすればよいですか?

追伸 余談ですが、2つの2000要素配列に対してこれを行う必要があります。通常、配列#1の要素は配列#2よりも少なくなりますが、これは保証されていません。

4

1 に答える 1

66

-演算子は2つの配列に適用され、in (inにあるがinにないアイテム)の相対的な補数ab与えます。baab

あなたが探しているのは、2つのセットの対称差(2つの間の両方の相対的な補集合の和集合)です。これでうまくいきます:

a = [1, 2, 9]
b = [1, 2, 3]
a - b | b - a          # => [3, 9]

Setオブジェクトを操作している場合は、オーバーロードされた^演算子を使用できます。

c = Set[1, 2, 9]
d = Set[1, 2, 3]
c ^ d                  # => #<Set: {3, 9}>

さらに楽しくするために、2つのセットの和集合で交差点の相対的な補数を見つけることもできます。

( a | b ) - ( a & b )  # => #<Set: {3, 9}>
于 2012-06-28T05:01:50.663 に答える