0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

hashについて ruby

Posted at

ハッシュとは

ハッシュは配列のインデックス部分をキーというものに置き換わり、バリュー(値)をそのキーに紐づいてデータを管理してくれるものです。

簡単にデータの集計とかをやってくれるので、配列でデータ集計するよりお手軽です。
例えば、下記のような処理を書いて、ユーザーのリストのようなプレーンテキストがあったとします。

hash.rb
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つのキーにハッシュが紐づいているというイメージです。

hash_hash.rb
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です

まとめ

データのアクセスのしやすさと、見易さが際立っていると思います。便利ですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?