[#42454] 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...>

出沢です

22 messages 2006/06/22
[#42455] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/22

From: しん <dezawa@aliadne.net>

[#42456] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42458] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42459] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42460] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42461] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です。

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

From: rubikitch <rubikitch@...>
Date: 2006-06-22 07:21:27 UTC
List: ruby-list #42447
From: Yoshihiro Sugihara <jinnee@tt.rim.or.jp>
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/

In This Thread

Prev Next