Hashの基礎
- Hashとは何か?
- Hashの使いどころ
- 基本的なHashの書き方
- 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クラスで使える頻出メソッド
- 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] }
参考元まとめ
若手エンジニア/初心者のためのRuby 2.1入門(3):Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方 (4/4) - @IT