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"]
参考
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る