ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Ruby - 配列を集合として扱う

インデックスでいじるだけが配列じゃない

配列を操作するとき、どれを取り出すか、どこからどこまでを置き換える、どこに挿入するか、といったインデックスを意識したようなものが多い印象がある。

しかし、配列のArrayクラスは、「インデックス付きオブジェクト」の集まりに過ぎず、集合としての配列という、インデックスを意識しない配列の使い方もあることもある。

「インデックスを意識しない配列の使い方」とは、[1,2,3][3,1,2][1,3,2]も全て同じ集合を表している、考えることが出来る、ということ。

なので、インデックスを意識した操作は、Arrayクラスの持ったメソッドの一部でしかない。

集合の演算

基本的に、集合の演算というと、AND(共通集合)とOR(和集合)である。

  • AND(共通集合)
    • 2つの集合どちらにも含まれる要素を抽出し 新たな集合を作る
  • OR(部分集合)
    • どちらか一方に含まれる要素を抽出し 新たな集合を作る

以上の演算は、Rubyのコードで表すと

  • AND(共通集合)=> array1 & array2
  • OR(部分集合)=> array1 | array2

となる。

また、Rubyでは補集合(ある集合からその集合に属していない要素を抽出する)がない。それは、Arrayクラスに全体集合に相当するものが定義されていないからで、その代わりに、ある集合からある集合の差を求める差の演算が可能。

  • 差の演算 => array2 - array1

具体的な例

array1 = %w(1 2 3 4 5 6 7 8 9 10)
array2 = %w(2 4 6 8 10)

p (array1 & array2)
p (array1 | array2)
p (array1 - array2)
["2", "4", "6", "8", "10"]
["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
["1", "3", "5", "7", "9"]

|+

集合を結合させるメソッドである|(OR)と+は、似てるようで、一部振る舞いが違うことに注意。

  • |(OR)
    • 2つの集合で被った要素はその要素は1つのみ含まれる
  • +
    • 2つの集合で被った要素はその数だけ含んでいく

具体的な例

array1 = %w(1 2 3 4)
array2 = %w(2 4)

p (array1 | array2)
p (array1 + array2)
["1", "2", "3", "4"]
["1", "2", "3", "4", "2", "4"]

参考

たのしいRuby 第5版

たのしいRuby 第5版