gotagota日記

「面白きことは良きことなり」

『たのしいruby 第4版』第15章 ハッシュ(Hash)クラス

第15章 ハッシュ(Hash)クラス

模範解答はこちら

(1)

問題

曜日を表す英語と日本語との対応を表すハッシュ wday を作成しろ、という問題です。

私的解答
wday = {:sunday => "日曜日", :monday => "月曜日", :tuesday => "火曜日", :wednesday => "水曜日", :thursday => "木曜日", :friday => "金曜日", :suturday => "土曜日" }
p wday[:sunday] #=> "日曜日"
p wday[:monday] #=> "月曜日"
p wday[:thursday] #=> "木曜日"

シンボルを利用しました。
模範解答のように見やすさにも考慮してコーディングするのも大事ですよね・・・。反省。

(2)

問題

(1)のハッシュ wday のペアの数を数えろ、という問題。

私的解答

wday = {:sunday => "日曜日", :monday => "月曜日", :tuesday => "火曜日", :wednesday => "水曜日", :thursday => "木曜日", :friday => "金曜日", :suturday => "土曜日" }
p wday.size #=> 7

size メソッドを使います。

(3)

問題

(1)のハッシュを使って、

「sunday」は日曜日のことです。
「monday」は月曜日のことです。
   :
   :

という文字列を出力させろ、という問題です。

私的解答
wday = {:sunday => "日曜日", :monday => "月曜日", :tuesday => "火曜日", :wednesday => "水曜日", :thursday => "木曜日", :friday => "金曜日", :suturday => "土曜日" }
wday.each do |key, value|
  puts "#{key}」は#{value}のことです。"
end

模範解答を見ると二度手間のような気がしてならないのですが、これはこれでメリットがあるのかな・・・?
深いです。

(4)

問題

空白とタブと改行(正規表現で言えば「/\s+/」)で区切られた文字列をハッシュに変換する str2hash メソッドを定義しろ、という問題です。

私的解答
def str2hash(str)
  strAry = str.split(/\s+/)
  hash = {}
  strAry.each do |s|
    nextIndex = strAry.index(s) + 1
    hash.store(s, strAry[nextIndex]) if strAry.index(s) % 2 == 0
  end
  return hash
end
p str2hash("blue 青 white 白\nred 赤")

まず文字列を「/\s+/」で区切って配列にしてから、 Hash#store メソッドを使ってインデックスが0か偶数のものをキーとして、奇数のものを値としてハッシュに追加していきます。

ただ、これだとどうも複雑になりすぎてるので、配列から指定した数だけを取り出す便利なメソッドはないものかとぐぐりますと each_slice というドンピシャメソッドがありました。

以下、使用例。

参考URL Ruby の配列で n 個ずつの要素を扱いたい - Qiita
def str2hash(str)
  strAry = str.split(/\s+/)
  hash = {}
  strAry.each_slice(2) do |a, b|
    hash.store(a, b)
  end
  return hash
end
p str2hash2("blue 青 white 白\nred 赤")

これでかなりすっきりしたんではないかと思います。