ハッシュとは
ハッシュは配列のインデックス部分をキーというものに置き換わり、バリュー(値)をそのキーに紐づいてデータを管理してくれるものです。
簡単にデータの集計とかをやってくれるので、配列でデータ集計するよりお手軽です。
例えば、下記のような処理を書いて、ユーザーのリストのようなプレーンテキストがあったとします。
name_count = {}
STDIN.each do |line|
line.chomp!
count = name_count[line] || 0
name_count[line] = count + 1
end
p name_count
name_count.keys.sort.each do |name|
value = name_count[name]
puts "#{name}が#{value}個発見されました"
end
Joutarou
Noriaki
Polnareff
Avdol
Joutarou
Noriaki
Joseph
Igy
Joutarou
Noriaki
Joutarou
Polnareff
Avdol
Joutarou
Joseph
Joseph
Polnareff
Avdol
Joseph
Igy
Joutarou
Igy
Joutarou
Igy
Joutarou
Noriaki
Joseph
Igy
Noriaki
Joseph
Igy
実行してみます。
$ ruby hash.rb < logfile
{"Joutarou "=>8, "Noriaki"=>5, "Polnareff"=>3, "Avdol"=>3, "Joseph"=>6, "Igy"=>6}
Avdolが3個発見されました
Igyが6個発見されました
Josephが6個発見されました
Joutarou が8個発見されました
Noriakiが5個発見されました
Polnareffが3個発見されました
出力結果の1番上にあるのが、ハッシュのデータそのものになります。キーとバリューがセットになって作られているのがわかります。
ハッシュで複数のバリューを持たせたい・・・
データを管理する方法として、先のコードでやったように集計も楽であることから配列のように一気に順番に出す以外で使うことがあるようなデータを取り扱う場合、ハッシュの方が便利にように思います。
配列でインデックスに複数配列を作ることもできますが、データ内へのアクセスの面倒さや、コードにした時の可読性にも難があります。ハッシュであれば、その両方をクリアできるように思います。例えば、ユーザー名に対して、今月のログイン数と、累計のログイン数のデータをセットで持たせたい場合、ハッシュの中にハッシュを組むことで、分かりやすくデータを管理することができます。1つのキーにハッシュが紐づいているというイメージです。
access_hash = {
"Joutarou" => 1,
"Avdol" => 3,
"Kakyouin" => 2,
"Joseph" => 8
}
ruikei_hash = {
"Joutarou" => 12,
"Avdol" => 12,
"Kakyouin" => 100,
"Joseph" => 22
}
matome_hash = {}
access_hash.keys.each do |name|
matome_hash[name] = {
"access" => access_hash[name],
"ruikei" => ruikei_hash[name]
}
end
p matome_hash
p matome_hash["Joutarou"]["ruikei"]
matome_hash.keys.sort.each do |name|
value = matome_hash[name]["access"]
puts "#{name}が#{value}です"
end
出力結果は下記になります。
$ ruby hash_hash.rb
{"Joutarou"=>{"access"=>1, "ruikei"=>12}, "Avdol"=>{"access"=>3, "ruikei"=>12}, "Kakyouin"=>{"access"=>2, "ruikei"=>100}, "Joseph"=>{"access"=>8, "ruikei"=>22}}
12
Avdolが3です
Josephが8です
Joutarouが1です
Kakyouinが2です
まとめ
データのアクセスのしやすさと、見易さが際立っていると思います。便利ですね。