【Ruby】配列クラス その2

前回 【Ruby】配列クラス - seconの日記 の続きです。


配列とイテレータ

代表的なイテレータである each メソッドは、配列内のすべての要素に対して特定の操作を行う。
また、レシーバが配列でない場合でも、イテレータを実行した結果を何かのオブジェクトにして返すために配列を使う、ということもある。こちらの場合での代表的なメソッドが collect メソッドである。

a = 1..5
b = a.collect{|i| i += 2}
p b  #=>[3, 4, 5, 6, 7]


配列内の各要素を処理する

繰り返しとインデックスを使う

# 配列の要素を1ずつ出力
list = ["a", "b", "c", "d"]
for i in 0..3
  print i+1,"番目の要素は",list[i],"です\n"
end
# 配列の要素の合計
list = [1, 3, 5, 7, 9]
sum = 0
for i in 0..4
  sum += list[i]
end
print "合計:", sum


each メソッドで要素を1つずつ得る

list = [1, 3, 5, 7, 9]
sum = 0
list.each do |i|
  sum += i
end
print "合計:", sum, "\n"

要素とそのインデックスが分かる each_with_index メソッドもある。

list = ["a", "b", "c", "d"]
list.each_with_index do |elem, i|
  print i+1,"番目の要素は",elem,"です\n"
end

破壊的なメソッドで繰り返しを行う

# 配列の要素がなくなったらループを抜ける
list = [1, 2, 3, 4, 5]
while i = list.shift
  p i * 2
end


配列の要素

配列はその要素としても、色々なオブジェクトを持つことが出来る。

簡単な行列を使う

配列の配列は、行列などを表現する場合に使われる。

a = [[1,2,3],[4,5,6],[7,8,9]]
p a[1][2]  #=> 6


初期化に注意

初期化の方法によっては、思った通りの操作が出来ない場合もある。

a = Array.new(3, [0,0,0])
p a  #=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][1] = 2
p a  #=> [[0, 2, 0], [0, 2, 0], [0, 2, 0]]
# すべての行の2つ目の要素が変更されてしまう
a = [[0,0,0],[0,0,0],[0,0,0]]
a[0][1] = 2
p a
# 特定の1つのみ変更できる

他にはこんな書き方もある。

a = Array.new(3) do
  [0,0,0]
end

a[0][1] = 2
p a  #=> [[0, 2, 0], [0, 0, 0], [0, 0, 0]]


複数の配列に並行してアクセスする

i = 0
result = []
while i < ary1.length
  result << ary1[i] + ary2[i] + ary3[i]
  i += 1
end
p result  #=> [111, 222, 333, 444]

zip メソッドを使うことで簡単に記述できる。

ary1 = [1, 2, 3, 4]
ary2 = [10, 20, 30, 40]
ary3 = [100, 200, 300, 400]

result = []
ary1.zip(ary2, ary3) do |a, b, c|
  result << a + b + c
end
p result  #=> [111, 222, 333, 444]