社会不適合破壊的お味噌マン

くまのプーさんのような大人になりたいです!

Hashの基礎

  1. Hashとは何か?
  2. Hashの使いどころ
  3. 基本的なHashの書き方
  4. Hashクラスで使える頻出メソッド
  • Hashとは何か?

Hashは、連想配列と呼ばれるコンテナでArrayとの違いは要素位置を表すインデックス(オブジェクトごとに勝手に生成される)とオブジェクトを管理していたのに対し、要素位置を表すインデックスの代わりにシンボル(:name, :passwordなど)や文字列など、任意のオブジェクトをキーにして、オブジェクトを格納したり取り出したりすることができるもの。

 

hash = {"jack" => 11, "queen" => 12, :king => 13}
=> {"jack"=>11, "queen"=>12, :king=>13}

(例の引用元 : http://www.atmarkit.co.jp/ait/articles/1405/08/news038_4.html#09

 

  • Hashの使いどころ

Hashはオブジェクトにキーが設定されているため、その値が何を表しているのか理解しやすい。データ構造が多少複雑になるとHashを使いキーとバリューを管理する。

例えば名前、パスワード、メールアドレスをデータを作成したい場合

 

Arrayで無理矢理書くと

[1]pry(main)> user = [[:name, "keioka], [:password, "abcde"], [:mail, "poyoyon@gmail.com"]]

(むしろ書けてるかわからない、)

 

Hashだと

[1]pry(main)> user = {name: "keioka", password: "abcde", mail: "poyopoyo@gmail.com"}
=> {:name=>"keioka", :password=>"abcde", :mail=>"poyopoyo@gmail.com"}

と書ける

 

  • 基本的なHashの書き方

- 値の取得

[1]pry(main)> user = {name: "keioka", password: "abcde", mail: "poyopoyo@gmail.com"}
=> {:name=>"keioka", :password=>"abcde", :mail=>"poyopoyo@gmail.com"}


[2]pry
(main)> user[:name] #Hashオブジェクト(ハッシュを格納しているオブジェクト)にキーを指定
=> "keioka"

[3]pry
(main)> user[:address]
=> nil

 

 

- ハッシュオブジェクトの作成の仕方

[1]pry(main)> hash = Hash[name: "keioka", password: "abcde", mail:"poyopoyo@gmail.com"] 

=> {:name=>"keioka", :password=>"abcde", :mail=>"poyopoyo@gmail.com"}


#または

[1]pry
(main)> hash = Hash.new()
=> {}

[1]pry
(main)> user = {name: "keioka"}
=> {:name=>"keioka"}
=> {

 

     

 - デフォルト値の扱い

[1]pry(main)> hash = Hash.new("none")
=>{}
[2]pry
(main)> hash[:name]
=> "none" #デフォルト値が出てくる

 

 - 要素の追加

[1]pry(main)> hash = {"Lemon" => 100, "Orange" => 150}
=> {"Lemon"=>100, "Orange"=>150}

[2]pry
(main)> hash["Banana"] = 90
=> 90

[3]pry(main)> hash
=> {"Lemon"=>100, "Orange"=>150, "Banana"=>90}

例の引用元: http://www.rubylife.jp/ini/hash/index4.html

 

- Hash.length #ハッシュオブジェクトの要素数を数える
[1]pry(main)> user = {name: "keioka", password: "abcde", mail: "poyopoyo@gmail.com"}
=> {:name=>"keioka", :password=>"abcde", :mail=>"poyopoyo@gmail.com"}


[2]pry
(main)> hash.length
=> 3

 

- Hash.size #ハッシュオブジェクトの要素数を数える
[1]pry(main)> user = {name: "keioka", password: "abcde", mail: "poyopoyo@gmail.com"}
=> {:name=>"keioka", :password=>"abcde", :mail=>"poyopoyo@gmail.com"}


[2]pry
(main)> hash.size
=> 3

 

- Hash.each #オブジェクトに対して繰り返し !ブロック変数を1つにすると{key,value}両方出力される
[1] pry(main)> user.each do |key,value| 
[2] pry(main)* p "#{key}は#{value}円です "
[3] pry(main)* end
"nameはkeioka円です "
"passwordはabcde円です "
"mailはkeioka0828@gmail.com円です "
[7] => {:name=>"keioka", :password=>"abcde", :mail=>"keioka0828@gmail.com"}

 

- Hash.each_key (value) #オブジェクトに対して繰り返し処理を行う 
[1] pry(main)> user.each_key do |key| 
[2] pry(main)* p key
[3] pry(main)* end
:name
:password
:mail
[7] => {:name=>"keioka", :password=>"abcde", :mail=>"keioka0828@gmail.com"}

 

- Hash.keys (values) #配列に格納する
[1] pry(main)> arr = user.keys
=> [:name, :password, :mail]

 

- Hash.to_a #配列変換
[1] pry(main)> user.to_a 
=> [[:name, "keioka"], [:password, "abcde"], [:mail, "keioka0828@gmail.com"]]

 

- Hash.invert #キーとバリュー入れ替え
[1] pry(main)> user.invert 
=> {"keioka"=>:name, "abcde"=>:password, "keioka0828@gmail.com"=>:mail}

 

- Hash #配列変換
[1] pry(main)> arr = [["name", "keioka"], ["password","abcde"]] 
=> [["name", "keioka"], ["password", "abcde"]]

[2] pry(main)> Hash[arr]
=> {"name"=>"keioka", "password"=>"abcde"}

 

- Hash #Valueで比較
h = {a: 29, b: 23, c: 39, d: 3} # x[0]とするとキーを参照できる 
p h.max{ |x, y| x[1] <=> y[1] }

 

参考元まとめ

ハッシュの使い方 - memo日記

若手エンジニア/初心者のためのRuby 2.1入門(3):Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方 (4/4) - @IT

[Ruby] 便利な組み込みクラスのメソッド達(Hash編) - Qiita

Ruby - Hash#maxでkeyではなくvalueで比較する - Qiita