【Ruby】配列とハッシュ

2015年9月9日

配列(Array)

配列(Array)を扱うには、下記のように[]で定義します。
配列の添字は 0 から始まります。
配列には異なった種類のオブジェクトを指定して作成したり、
配列の各要素には、異なった種類のオブジェクトを代入する事もできます。

days = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
puts days[0]    # Sun
puts days[1]    # Mon
human = ["山本", "太郎", 2015, 9, 1, "男性"]

1次元配列は、個数以上の添字を指定してもエラーになりません。

配列の長さよりも大きい添字を指定して代入すると配列の長さは自動的に拡張されます。
※ 配列の長さを拡張する時、
(最大長のインデックス + 1)である必要はなくて任意の添字を指定できます。
オブジェクトが代入されていない要素は、
「nil」オブジェクトが代入されたものとして処理されます。

下記メゾットを使って、配列を操作することができます。

push:末尾に要素を追加。
concat:末尾に配列を結合。
pop:末尾の要素を取り除いて返す。
unshift:先頭に要素を追加。

二次元、三次元の配列も扱うこともできます。

data = [ [ "A", 1 ], [ "B", 2 ], [ "C", 3 ] ]
puts data[0][0]    # A
puts data[2][1]    # 3

こちらは、個数以上の添字を指定するとエラーになります。

配列の個数は size または length メソッドを使うと取得できます。

days = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
data = [ [ "A", 1 ], [ "B", 2 ], [ "C", 3 ] ]

puts days.size      # 7
puts days.length    # 7
puts data.length    # 3
puts data[0].length # 2 :"A", 1 で2個

配列を繰り返し参照するには、each を用います。

days = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
days.each { |x|
  puts x          # Sun, Mon, Tue, Wed, Thu, Fri, Sat
}

ハッシュ(Hash)

文字列をキー値(添字)とするオブジェクトを扱うには、下記のよう{}で定義します。
これをハッシュ(Hash)と言います。
要素に代入したり、要素を参照する場合には、[キー値]を使います。
新しい要素として追加したい場合も代入と同じ書式を使います。
存在しないキーを指定して値を代入すると、新しい要素として自動的に追加されます。

mon = { "Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4, "May" => 5, "Jun" => 6,
        "Jul" => 7, "Aug" => 8, "Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12 }
puts mon['Jan']    # 1
puts mon['Dec']    # 12

配列の個数は size または length メソッドを使うと取得できます。

mon = { "Jan" => 1, "Feb" => 2, "Mar" => 3 }
puts mon.size      # 3
puts mon.length    # 3

「store」メソッドを使うと、
新しい要素を追加したり、指定したキーに対して新しい値を代入することができます。

store(key,value)

ハッシュの各要素について繰り返し処理をするには、
each_key, each_value, each_pair メゾットを使用します。

mon = { "Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4, "May" => 5, "Jun" => 6,
        "Jul" => 7, "Aug" => 8, "Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12 }

mon.each_key { |key|
  puts key                    # Jan, Feb, Mar...,Dec
}

mon.each_value { |val|
  puts val                    # 1, 2, 3...,12
}

mon.each_pair { |key, val|
  puts "#{key}=#{val}"        # Jan=1, Feb=2, Mar=3...,Dec=12
}

Ruby2入門

Posted by 管理人