配列からハッシュを作成する

広告

配列で用意された値を元にハッシュを作成する方法を確認します。配列を元にハッシュを作成するには次の構文を使用します。

Hash[key,value,...]

引数:
  key  キー
  value  値
戻り値:
  新しいハッシュオブジェクト

引数としてキーと値のペアをカンマ(,)で区切って順に記述します。複数個のペアを記述する場合は続けて記述して下さい。例えば次のようになります。

h = Hash["suzuki", 87, "itou", 76, "yamada", 69]

この場合、3つのキーと値のペアを持つハッシュを新しく作成します。

配列からハッシュを作成する

では先ほどの構文の引数を指定する方法として配列を使って指定する方法を確認します。1番目の方法は引数に指定するのと同じ要素を持つ配列を使用することです。

ary = ["suzuki", 87, "itou", 76, "yamada", 69]

この配列の値を元にハッシュを作成するには次のように行います。

ary = ["suzuki", 87, "itou", 76, "yamada", 69]
h = Hash[*ary]

配列オブジェクトを格納している変数の先頭にアスタリスク(*)を付けた場合、配列の多重代入と言う処理が行われます。これは配列に格納されている要素を全て代入するという方法です。結果として配列に格納されていた各要素が一つ一つHashの引数として指定されたのと同じ結果となります。

2番目の方法はキーと値が1つの配列となっているものを要素とした配列を使います。

ary = ["suzuki", 87, "itou", 76, "yamada", 69]

この配列の値を元にハッシュを作成するには次のように行います。

ary = [["suzuki", 87], ["itou", 76], ["yamada", 69]]
h = Hash[*ary.flatten]

この方法の場合、まず配列「ary」が「flatten」メソッドによって平滑化された新しい配列が作成されます。つまり配列が次のような配列になります

ary = ["suzuki", 87, "itou", 76, "yamada", 69]

平滑化された配列は1番目の方法と同じ配列となっていますので、その配列に対してアスタリスクを使って多重代入を行うことでHashの引数として指定を行います。(配列の平滑化については『ネストした配列を平滑化する』を参照して下さい)。

3番目の方法はキーと値がそれぞれ別の配列となっているもの使います。

keyAry = ["suzuki", "itou", "yamada"]
keyValue = [87, 76, 69]

この配列の値を元にハッシュを作成するには次のように行います。

keyAry = ["suzuki", "itou", "yamada"]
keyValue = [87, 76, 69]
ary = [keyAry,keyValue].transpose
h = Hash[*ary.flatten]

この方法の場合、まず配列「keyAry」と配列「keyValue」を要素とする配列を作成します。

ary = [["suzuki", "itou", "yamada"], [87, 76, 69]]

次にArrayクラス「transpose」メソッドによって次のように変換されます。(「transpose」メソッドについては『ネストされた配列を行列とみなして行と列を入れ替える』を参照して下さい)。

ary = [["suzuki", 87], ["itou", 76], ["yamada", 69]]

これで2番目の方式の配列と同じ形になりましたので最後に「flatten」メソッドによって配列を平滑化した後で多重代入を行うことでHashの引数として指定を行います。

これらのように配列として持っている値からハッシュを作成するには特別なメソッドが用意されているわけではないため、配列に含まれる要素をうまく展開してハッシュの初期値として指定するようにします。

サンプルプログラム

では簡単なサンプルで試してみます。

LibraryHash7.rb

#! ruby -Ks

keyAry = ["suzuki", "itou", "yamada"]
keyValue = [87, 76, 69]
ary = [keyAry,keyValue].transpose
h = Hash[*ary.flatten]

p h

実行結果は次のようになります。

配列からハッシュを作成する

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)