Rubyで配列操作

Rubyでの配列操作をまとめてみました。

0. 定義
他にもStringクラスのsplitなどでも作り出せますね。

a = [1 ,2, 3]
b = %w[str1 str2 str3] # ["str1", "str2", "str3"]

1.ランダムアクセス

a[0] # 最初の要素
a[-1] # 最後の要素
a[0..2] # インデクス0からインデクス2まで
a[0..2] = [11, 12, 13] # 代入もできる(slice的な)
a[0, 2] # インデクス0から2個

2.追加/取り出し

a << 100 # 末尾に追加
a.push 200 # 末尾に追加
a.pop # 末尾から取り出し
a.unshift 300 # 先頭に追加
a.shift # 先頭から取り出し

スタックを作りたい: push+popの組み合わせ、またはunshift+shiftの組み合わせ
キューを作りたい: push+shiftに組み合わせ、またはunshift+popの組み合わせ


3.集合演算
この機能が組み込みで使えるのは結構便利だと思う。
チェックボックスをつけたりはずしたりで、任意の集合を既存の選択と新しい選択の集合から永続化されたデータを更新するときとか。

[1, 2, 3] & [1, 2, 4] #=> [1, 2] 積集合
[1, 2, 3] | [1, 2, 4] #=> [1, 2, 3, 4] 和集合
[1, 2, 3] - [1, 2, 4] #=> [3] 差集合

4.全体への操作/検索
mapはPerlと同じ、Perlgrepはselect。
Rubyにもgrepメソッドはあるが引数が正規表現のみ。
メソッドの最後にビックリマークをつけると自分自身を変更したりする。

a = [1, 2, 3]
a.size #=> 3 (配列の大きさ, lengthもあり)
a.map{|x| x*3 } #=> [3, 6, 9]
a.select{|x| x%2==0 } #=> [2]
b = [1, nil, 3]
b.conpact #=> [1, 3] (nilを取り除く, b.select{|x| x != nil })
b.index(nil) #=> 1 (引数の要素が最初に出てくるindex)
a.reverse #=> [3, 2, 1]
x = [2, 3, 1]
x.sort{|a,b| a<=>b } # 昇順ソート(1.8だとスコープが見えるa,bの内容を上書きするので注意)
x.join("-") #=> "2-3-1"
y = [1, 1, 2, 3, 4, 5, 5]
y.uniq #=> [1, 2, 3, 4, 5]
[1, 2].concat([3, 4]) #=> [1, 2, 3, 4] (配列の連結)

5.繰り返し処理
PerlPHPならforeach
値を変更するだけならmap!とかもあり。
フィルタリングを行いたいならselectやdelete_if(reject!)も検討すべき。

x = %w[iMac iBook iPod iPhone iPad]
x.each do |product|
  puts "Say hello to #{product}"
end