|ATOM |RDF トップ «前の日記(2004-09-05 [日]) 最新 次の日記(2004-09-10 [金])» 編集 a
2002|03|04|05|06|07|08|09|10|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|07|08|09|10|
2006|02|05|06|

たわごと


2004-09-06 [月]

_ [Ruby] 複数の配列に対してmapを行うには

配列の要素に対して何か処理を行う場合は、添字アクセスよりもArray#each、Array#mapメソッドを使うのがRubyっぽくてよい。例えばArray#map(各要素を順に評価し、結果を配列にして返すメソッド)はこのように使う。
a = [1, 2, 3, 4, 5]
r = a.map{|e|
  e * 5
}
p r   #=> [5, 10, 15, 20, 25]
上記例では一つの配列の各要素を順に評価するだけであるため、非常にシンプルである。 では要素数が同一の複数の配列に対して、順に評価していくにはどうしたら良いだろうか。
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = []
a.size.times{|i|      # aの要素数分(5回)繰り返す
  r[i] = a[i] * b[i]  # r.pushでも可
}
p r   #=> [1, 4, 12, 32, 80]
これでもまあ良いのだけれど、各要素を順に評価して結果を返すという処理の流れからして、Array#mapにあたるものを使いたい。例えばArray#map_with_indexというメソッドがあったら・・・
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = a.map_with_index{|elem_a, i|  # こんなメソッド存在しないけど
  elem_a * b[i]
}
p r   #=> [1, 4, 12, 32, 80] になったらいいなぁ^^;
こんなメソッドあったら便利そうだけど、実際はこんなメソッドは存在しない。 結局こんなコードを考えてみた。
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = [a, b].transpose.map{|e|
  e[0] * e[1]
}
p r   #=> [1, 4, 12, 32, 80]
ん、これで解決かな。

_ [] 木枯し*12の練習曲第11番イ短調 / Chopin

本日のTrackBacks(全1件) [TrackBack URL: http://yaya.sakuratan.com/diary/tb.rb/20040906]

hermes purse how much たわごと(2004-09-06)