【Ruby入門】Hash(ハッシュ)の使い方 (each fetch find select)

Hash(ハッシュ)の概念は初学者の方にとって馴染みがなく、詰まりやすいポイントでもあります。Hashを使っていると、以下のような問題に直面することがあります。

Hashのサイズや要素を追加する方法が知りたい
Hashを結合する方法が知りたい
Hashの要素を検索、並び替えを行いたい

そこでこの記事では、Rubyのハッシュ(hash)について以下の内容を解説していきます。

  • 【基礎】そもそもHash(ハッシュ)とは?
  • 【基礎】Hash(ハッシュ)の要素を取得する
  • 【基礎】Hash(ハッシュ)に要素を追加する
  • 【基礎】Hash(ハッシュ)のサイズを取得する(size,length)
  • 【基礎】Hash(ハッシュ)の要素を削除する
  • 【基礎】Hash(ハッシュ)を結合する
  • 【発展】Hash(ハッシュ)のfindメソッド
  • 【発展】Hash(ハッシュ)のsortメソッド
  • 【発展】Hash(ハッシュ)のeachメソッド

Hashの基本から応用までわかりやすく解説していますので、ぜひ参考にしてください。

そもそもHash(ハッシュ)とは?

shutterstock_229910752

画像:shutter stock

配列は一つの要素にオブジェクトが一つ入っていたのに対して、ハッシュはオブジェクトがキーとバリューの二つ入っているのが特長です。たとえば、フルーツの名前と値段をそれぞれハッシュに格納してみましょう。

fruits = {"apple": "100円", "orange": "80円", "melon": "500"}

p fruits

実行結果:

{:apple=>"100円", :orange=>"80円", :melon=>"500"}

このように一つの要素に二つのオブジェクトが格納されていることがわかります。

  • apple,、orangeなどの部分を「キー(key)」
  • 100円、80円などの部分を「バリュー(value)」

とそれぞれ呼ぶのでそれぞれ覚えておくようにしましょう!ハッシュの利点はapple ⇢ 100円のように、各要素に意味やつながりをもたせることができるという点にあります。そのため、キーと値をペアで関連付けたい時にハッシュはとても重宝します!

また、この他にも色々な場面でハッシュ利用されているのでRubyを書く上で必ず必要な知識といっても過言ではありません!

Rubyのハッシュについては、以下の記事でも基本を詳しく解説してありますので、一読されることをおすすめします。


【完全網羅】ruby hash 初期化方法まとめ
更新日 : 2017年2月22日

Hash(ハッシュ)の基本的な使い方

Hash(ハッシュ)の要素を取得する

ハッシュ[設定したキー]で取り出す

それでは、まずはハッシュ[設定したキー]で要素を取得する方法からみていきましょう。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash[:ruby]
p hash[:python]
p hash[:go]
[実行結果]
"rails"
"Django"
nil

基本的にはハッシュ[設定したキー]でキーとセットになっているバリューを取り出すことができます。:rubyに対して"rails"が、:pythonに対して"Django"がそれぞれ結果として返ってきていることを確認できます。

また、注目すべきは最後のnilです。hash[:go]でパリューを取り出そうとしていますが、:goは設定されていません。ハッシュ[設定したキー]の形式で設定されていないキーでバリューを取り出そうとするとnilが返ってくるようになっています。

fetchメソッドを使ってを取り出す

ハッシュ[設定したキー]で、バリューを取り出せますが、fetchメソッドを使っても取り出すことができます。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash.fetch(:ruby)
p hash.fetch(:php)
p hash.fetch(:jave)
p hash.fetch(:jave,"Spring")
[実行結果]
"rails"
"cakePHP"
KeyError: key not found: :jave
"Spring"

このようにハッシュ.fetch(設定したキー)の形式でパリューを取り出せます。これはさきほどの場合となんら変わりありません。ここで注目すべきはKeyErrorの部分です。fetchでは、キーが設定されていない場合例外を返すようになっています。

なので、例外処理をしやすいようになっています。また、fetchメソッドでは最後の出力では設定されていないキーに対して、デフォルトのバリューを設定できます。このようにバリューを設定しておけば、もしもキーが設定されていなかった場合にも例外ではなく設定したバリューを返すことができます。

Hash(ハッシュ)に要素をを追加する

次にハッシュに要素を追加する方法を解説します。基本的にはハッシュ[:新しいキー] = 新しいバリューの形式で値を追加することができます。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash[:java] = "Spring"
p hash
[実行結果]
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP", :java=>"Spring"}

このように、新しく:javaのキーで"Spring"のバリューが追加されていることを確認できます。また、storeメソッドを使っても同様に追加することもできます。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash.store(:java,"Spring")
p hash
[実行結果]
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP", :java=>"Spring"}

storeメソッドはエイリアス(名前は違っても機能は同じ)なので、使いやすいほうを使いましょう。

Hash(ハッシュ)のサイズを取得する(size,length)

ハッシュの要素の数を取得するにはsize、またはlengthメソッドを使用します。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash.size
p hash.length
hash.store(:swift,"perfect")
p hash.size
p hash.length
[実行結果]
3
3
4
4

このように、始めは3が返ってきて、:swift、"perfect"を追加したので、その後は4が返ってきています。

Hash(ハッシュ)の要素を削除する

基本的な要素の削除はdeleteメソッドを使用します。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash.delete(:ruby)
p hash
[実行結果]
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:python=>"Django", :php=>"cakePHP"}

このように、ハッシュ.delete(削除したい要素のキー)の形式で簡単に削除できます。また、delete_ifかrejectメソッドを使えば、条件を設定して要素を削除することができるので、とても便利です。

hash = {ruby:"rails",python:"Django",php:"cakePHP"}
p hash
hash.delete_if{|key,value| value.size == 6}
p hash
hash.reject!{|key,value| value.size == 7}
p hash
[実行結果]
{:ruby=>"rails", :python=>"Django", :php=>"cakePHP"}
{:ruby=>"rails", :php=>"cakePHP"}
{:ruby=>"rails"}

value.sizeで文字の数を取得しています。sizeはハッシュの要素の数を数えることもできますが、Stringの文字数を数えることもできます。"Django"は6文字で、"cakePHP"は7文字なのでそれぞれ削除されました。

delete_ifとrejectですが、両者には微妙に違いがあります。まずdelete_ifは!をつけなくても破壊的メソッドですが、rejectは!をつけないと破壊的メソッドではありません。(破壊的メソッドとはレシーバー自体に変更を加えるメソッドのことです。)

また、delete_ifは条件になにも引っかからなかった時に、そのままレシーバーを返しますが、reject!はnilを返します。一見同じようなメソッドでも、微妙に挙動が違うので覚えておいてください。

Hash(ハッシュ)を結合する

ハッシュを結合するにはmergeメソッドを使用します。

hash1 = {ruby:"rails",php:"cakePHP"}
hash2= {python:"Django",java:"Spring"}
hash3= hash1.merge(hash2)
p hash3
[実行結果]
{:ruby=>"rails", :php=>"cakePHP", :python=>"Django", :java=>"Spring"}

このように、mergeメソッドは非常に直感的ですね。hash3にはhash1とhash2の要素が詰め込まれています。

Hash(ハッシュ)の便利なメソッド

Hash(ハッシュ)にまつわるメソッドをまとめてみました。基本的なメソッドを理解した後は、いざという時に適切にメソッドが使えるように様々なメソッドを頭にいれておきましょう。

find:ハッシュの要素を検索する

ハッシュでキーや値を指定して検索したい場合はfindメソッドを使用します。たとえば、ハッシュでキーが”apple”の要素が存在するか検索する場合は以下のように記述します。

fruits = { "apple" => 100, "orange" => 80, "melon" => 500 }
p fruits.find {|k,v| k == "apple"}
[実行結果]
["apple", 100]

このようにキー”apple”に一致したハッシュの要素を取得できました!findメソッドの詳しい使い方については、以下の記事を参考にしてください!

sort:ハッシュの要素をソートする

ハッシュの要素を昇順や降順で並び替えたい場合はsortメソッドを使用します。たとえば、ハッシュのキーで昇順にsortしたい場合は以下のように記述します。

h = { "def" => 2, "ghi" => 1, "abc" => 3 }
p h.sort
p h
[実行結果]
[["abc", 3], ["def", 2], ["ghi", 1]]
{"def"=>2, "ghi"=>1, "abc"=>3}

このようにハッシュのキーでソートできることがわかりますね!sortメソッドの詳しい使い方については以下の記事を参考にしてください!

each:一括で値を取り出す

ハッシュからさまざまな方法で値を取り出したい場合はeachメソッドを使用します。たとえば、ハッシュのキーと値を1つずつ取り出したい場合は以下のように記述します。

hash = { Samurai: 1, Ruby: 2, Rails: 3 , Swift: 4, Java: 5, PHP: 6}
hash.each { |key, value| puts "#{key} => #{value}"}
[実行結果]
Samurai => 1
Ruby => 2
Rails => 3
Swift => 4
Java => 5
PHP => 6

このようにfor文のループで要素を1つずつ取り出すような処理が、eachメソッドを使用すれば簡単にできます。eachメソッドの詳しい使い方については以下の記事を参考にしてください!

【Ruby eachの応用編】さまざまな使い方を網羅的に理解しよう
更新日 : 2019年4月12日

まとめ

今回はRubyのハッシュについてまとめていきました。Rubyでは配列よりハッシュの方が好んで使用されることが多く、配列より自由度が高いのも特長です。ハッシュは初心者の人がつまづきやすいポイントでもあるのでしっかりと復習してください。

また、基本を理解した後は関連記事をとことん読んでHash(ハッシュ)を完全にマスターしましょう。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。