logo       

[ruby-list:42447] Re: rubyで多次元配列の作り方: msg#00101

lang.ruby.japanese

Subject: [ruby-list:42447] Re: rubyで多次元配列の作り方

From: Yoshihiro Sugihara <jinnee-DFxqcuf94YLbmG5+kqVDhQ@xxxxxxxxxxxxxxxx>
Subject: [ruby-list:42442] rubyで多次元配列の作り方
Date: Thu, 22 Jun 2006 15:39:06 +0900

るびきちです。

> 初歩的な質問で申し訳ないんですが、Rubyで多次元配列の使い方が判りません。
> Arrayクラスにはどうも多次元配列をサポートしてないようだったので、

Arrayは直接多次元配列をサポートしているわけではありません。

中級レベルになりますが、数値計算で多次元配列が欲しいならばnarrayライブ
ラリを使うのが定番でしょう。

http://raa.ruby-lang.org/list.rhtml?name=narray

> Hashクラスを用いて
> irb(main):074:0> i=0
> => 0
> irb(main):075:0> j=0
> => 0
> irb(main):076:0> while i<5
> irb(main):077:1> while j<5
> irb(main):078:2> hs["i,j"]=i+j
> irb(main):079:2> j +=1
> irb(main):080:2> end
> irb(main):081:1> i += 1
> irb(main):082:1> end
> irb(main):083:0> p hs
> {"i,j"=>4}
> => nil

hs["i,j"]の部分をhs["#{i},{#j}"]にしないとだめです。
また、jの初期化位置が間違っています。
オリジナルに忠実に修正するとこうでしょうか。

hs={}
i=0
while i<5
j=0
while j<5
hs["#{i},#{j}"]=i+j
j +=1
end
i += 1
end
p hs.length
p hs["2,3"]

また、HashのkeyをArrayにすることで擬似的に多次元配列が実現できます。
こっちのほうがきれいでしょう。

hs={}
i=0
while i<5
j=0
while j<5
hs[[i,j]]=i+j
j +=1
end
i += 1
end
p hs.length
p hs[[2,3]]


さらに、Rubyらしくするには、ループ処理をイテレータで抽象化します!!
5.times do |i|
はiが0から4まで繰り返します。
0.step(4) do

(0..4).each do
書き方もあります。
(0..4)はRangeオブジェクトで0から4までの範囲を表します。

hs={}
5.times do |i|
5.times do |j|
hs[[i,j]]=i+j
end
end

p hs.length
p hs[[2,3]]


mapは配列(やそれに準ずるもの)の各要素に対してブロックを評価した結果を
全て含む配列を返します。
[1,2].map{|x| x*2 } # => [2,4]
(0..4).map{|x| x*2} # => [0,2,4,6,8]

これを二重に使ってやるとあっさり多次元配列ができます。

hs = (0..4).map do |i|
(0..4).map do |j|
i+j
end
end

p hs.length # 5
p hs.flatten.length # 25
p hs[2][3] # 5
p hs

高度な抽象化ができるところは、Rubyの一番かっこいい部分のひとつだと思います。
そしてプログラミングを効率よく、そして楽しいものにしてくれます。

--
rubikitch
http://www.rubyist.net/~rubikitch/




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise