Rubyで配列の共通部分、共用体、サブセットを取得するにはどうすればよいですか?


170

Multisetというクラスのさまざまなメソッドを作成したいと思います。

必要なメソッドはすべてありますが、intersectionメソッド、unionメソッド、およびサブセットメソッドの記述方法がわかりません。

交差とユニオンの場合、私のコードは次のように始まります。

def intersect(var)
  x = Multiset.new
end

次に例を示します。

X = [1, 1, 2, 4]
Y = [1, 2, 2, 2]

その後の交差点はXYあります[1, 2]



@Kruleのリンクは壊れていますが、交差を行う配列の「&」メソッドを彼が指摘していたと思います。回答のいくつかをここで参照してください。
rogerdpack

それは8年以上前に答えられました。はい、それは交差点でした、ruby-doc.org / core
2.6.3 / Array.html#

回答:


151

&(交差)、-(差)、および(差)を実行することにより、配列に対してセット演算を実行できるという事実を利用します。|(ユニオン)。

明らかに、私はMultiSetを仕様に実装していませんが、これで始められるはずです:

class MultiSet
  attr_accessor :set
  def initialize(set)
    @set = set
  end
  # intersection
  def &(other)
    @set & other.set
  end
  # difference
  def -(other)
    @set - other.set
  end
  # union
  def |(other)
    @set | other.set
  end
end

x = MultiSet.new([1,1,2,2,3,4,5,6])
y = MultiSet.new([1,3,5,6])

p x - y # [2,2,4]
p x & y # [1,3,5,6]
p x | y # [1,2,3,4,5,6]

8
この回答の2つの大きな犯罪:(1)set単純な配列の変数名としての単語。(2)Arrayすでに行っているすべてを複製する。OPはに機能を追加したい場合はArray、いくつかの追加のメソッドを持つクラスは、単に実行する必要があります class MultiSet < Array def inclusion?(other) Set.new(self).subset?(Set.new(other)) end end
ラーフルMurmuria

1
同意します...これはおそらく私の人生で見た中で最も役に立たないクラスです...
mpowered、

313

私は仮定XY、配列ですか?もしそうなら、これを行う非常に簡単な方法があります:

x = [1, 1, 2, 4]
y = [1, 2, 2, 2]

# intersection
x & y            # => [1, 2]

# union
x | y            # => [1, 2, 4]

# difference
x - y            # => [4]

ソース


17
言い換えれば、実行するだけですMultiset < Array
佐和

x = [1,1,2,4] y = [1,2,2,2] z = [4]がある場合はどうすれば、すべての交差ではなくセットとの交差が得られますかセット?だから、あなたに[]を与える代わりに、それは[1,2,4]を与えるのですか
mharris7190 14

1
@ mharris7190あなたはそれらすべての交差点の結合を取ることができます:(x & y) | (y & z) | (x & z)
xavdid

2
、、もあるので、すぐに値を保存したい場合&=|=-=私のようにしてください。:)
Pysis

2
まさに私が@sawaと思ったもの。なぜOPが最初にこのクラスを作成するのですか?ArrayがRubyのStandard Libで行っていないことは何もしません。
danielricecodes 2017

6

クラスMultisetから拡張する場合Array

x = [1, 1, 2, 4, 7]
y = [1, 2, 2, 2]
z = [1, 1, 3, 7]

連合

x.union(y)           # => [1, 2, 4, 7]      (ONLY IN RUBY 2.6)
x.union(y, z)        # => [1, 2, 4, 7, 3]   (ONLY IN RUBY 2.6)
x | y                # => [1, 2, 4, 7]

x.difference(y)      # => [4, 7] (ONLY IN RUBY 2.6)
x.difference(y, z)   # => [4] (ONLY IN RUBY 2.6)
x - y                # => [4, 7]

交差点

x & y                # => [1, 2]

Ruby 2.6の新しいメソッドの詳細については、このブログ投稿で新機能について確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.