【Ruby入門】ハッシュ(Hash)を使ってみよう(基本の使い方を網羅)

最初に覚えておきたい Ruby でのハッシュ(Hash)の使い方を解説します。

これを見れば、ひととおりのハッシュの基本操作が覚えられます。

メモ

そもそもハッシュとは何か? という解説はこちら

 

ハッシュを生成する

ハッシュは {} を使って表します。

以下は「score」という変数をハッシュにするプログラム。

score = {}
メモ
score = Hash.new

で表す方法もあります。

 

あらかじめハッシュに値を入れておきたい場合は、{キー1 => 値1, キー2 => 値2, キー3 => 値3, ……} のように指定します。

以下は、最初から値を入れておく場合の例。

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
メモ
score = {suzuki: 80, tanaka: 70, yamada: 90}

で表す方法もあります。

メモ

キーは :suzuki のように、先頭にコロン(:)がついていますが、これはシンボルと言います。

score = {"suzuki" => 80, "tanaka" => 70, "yamada" => 90}

のようにキーに文字列を使うこともできますが、シンボルを用いたほうが処理が高速になります(参考URL: class Symbol – Ruby リファレンスマニュアル)。

 

ハッシュの特定の値を取得する

キーを使ってハッシュの特定の値を取得できます。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score[:tanaka]

実行結果

70

 

ハッシュの要素を順番に取得する

ハッシュの要素を順番に取り出して取得する場合は、each メソッドを使います。

以下は「score」の変数に格納されているハッシュの値をひとつずつ順番に取り出して表示する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score.each do |key, value|
  p "#{key}さんの点数は#{value}点です"
end

実行結果

"suzukiさんの点数は80点です"
"tanakaさんの点数は70点です"
"yamadaさんの点数は90点です"
メモ

do |key, value| 〜 end のブロック内にハッシュの要素ひとつひとつに対して行いたい処理を書きます。

key にはキー、value にはバリューの値が入ります。今回は p "#{key}さんの点数は#{value}点です" でキーとバリューの値を表示しています。

each do 〜 end の詳しい使い方はこちら(作成中)。

 

ハッシュのキー一覧を取得する

ハッシュのキー一覧を取得する場合は、keys メソッドを使います。結果は配列になります。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.keys

実行結果

[:suzuki, :tanaka, :yamada]

 

ハッシュのバリュー一覧を取得する

ハッシュのバリュー一覧を取得する場合は、values メソッドを使います。結果は配列になります。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.values

実行結果

[80, 70, 90]

 

ハッシュに要素を追加・更新する

ハッシュに新たな要素を追加することができます。

以下は :sato というキーと 60 のバリューのペアを追加する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score[:sato] = 60
p score

実行結果

{:suzuki=>80, :tanaka=>70, :yamada=>90, :sato=>60}
メモ
score.store(:sato, 60)

のようにしてハッシュに要素を追加することもできます。

 

要素の更新も、追加の場合と同様に行うことができます。

以下はキーが :suzuki のバリューを 60 に更新する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score[:suzuki] = 60
p score

実行結果

{:suzuki=>60, :tanaka=>70, :yamada=>90}
メモ
score.store(:suzuki, 60)

のようにしてハッシュの要素を更新することもできます。

 

指定したキーの要素を削除する

指定したハッシュの要素を削除したい場合は、delete メソッドを使います。

以下は、キーが :tanaka の要素を削除する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score.delete(:tanaka)
p score

実行結果

{:suzuki=>80, :yamada=>90}

 

指定した条件に一致する要素を削除する

指定した条件に一致する要素を削除したい場合は、delete_if または reject! メソッドを使います。

以下は、バリューが80以上の要素を削除する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score.delete_if {|key, value| value >= 80 }
p score

実行結果

{:tanaka=>70}
メモ

reject! メソッドを使う場合も、以下のように同様の形で記述できます。

score.reject! {|key, value| value >= 80 }
メモ

value >= 80 の部分を書き換えると別の条件でソートできます。

  • バリューが75以下の要素: value <= 75
  • キーが :suzuki の要素: key == :suzuki
  • バリューが5で割り切れる要素: value % 5 == 0

 

ハッシュの要素数を取得する

ハッシュの要素数を取得したい場合は、length もしくは size メソッドを使います。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.length
p score.size

実行結果

3
3

 

ハッシュが空(要素がひとつもない)かどうかを調べる

ハッシュが空(要素がひとつもない)かどうかを調べたい場合は、empty? メソッドを使います。

 

ハッシュに要素が1つ以上ある場合は、以下のように false が返ります。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.empty?

実行結果

false

 

ハッシュが空(要素がひとつもない)の場合は、以下のように true が返ります。

プログラム

score = {}
p score.empty?

実行結果

true

 

指定したキーが含まれるか確認する

指定したキーが含まれるか確認したい場合は、include? メソッドを使います。

含まれる場合は true、含まれない場合は false の結果が返ってきます。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.include?(:tanaka)
p score.include?(:sato)

実行結果

true
false
メモ

include? の代わりに、has_key? や key? を使うことも可能です。

 

指定したバリューが含まれるか確認する

指定したバリューが含まれるか確認したい場合は、has_value? メソッドを使います。

含まれる場合は true、含まれない場合は false の結果が返ってきます。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.has_value?(80)
p score.has_value?(100)

実行結果

true
false
メモ

has_value? の代わりに、value? を使うことも可能です。

 

指定した条件に合う要素を取得する

指定した条件に合う要素を取得したい場合は、find メソッドを使います。

以下は、80以上の条件に合う要素を取得する例。

プログラム

score = {:suzuki => 80, :tanaka => 70, :yamada => 90}
p score.select {|key, value| value >= 80 }

実行結果

{:suzuki=>80, :yamada=>90}
メモ

value >= 80 の部分を書き換えると別の条件でソートできます。

  • バリューが75以下の要素: value <= 75
  • キーが :suzuki の要素: key == :suzuki
  • バリューが5で割り切れる要素: value % 5 == 0

 

ハッシュを結合する

2つのハッシュを組み合わせて 1つのハッシュに結合したい場合は、merge メソッドを使います。

 

プログラム

score1 = {:suzuki => 80, :tanaka => 70, :yamada => 90}
score2 = {:sato => 100}
p score1.merge(score2)

実行結果

{:suzuki=>80, :tanaka=>70, :yamada=>90, :sato=>100}

 

ハッシュの要素を並び替える

ハッシュの要素を並び替えたい場合は、sort を使います。結果は配列になります。

以下はキーの昇順に並び替える例。

プログラム

score = {:ccc => 80, :aaa => 70, :bbb => 90}
p score.sort

実行結果

[[:aaa, 70], [:bbb, 90], [:ccc, 80]]

 

以下は降順に並び替える例。

プログラム

score = {:ccc => 80, :aaaa => 70, :bbb => 90}
p score.sort {|(key1, value1), (key2, value2)| key2 <=> key1 }

実行結果

[[:ccc, 80], [:bbb, 90], [:aaaa, 70]]
メモ

key2 <=> key1 の部分を書き換えると別の条件でソートできます。

キーの昇順でソート: key1 <=> key2

バリューの降順でソート: value2 <=> value1

バリューを整数に変換して昇順でソート: value1.to_i <=> value2.to_i

 

まとめ

以上、Ruby でのハッシュ(Hash)の使い方でした!

 

ここまでの内容をまとめておきます。

  • ハッシュは 変数名 = {} で生成できる。
  • 値を最初からセットしたい場合は 変数名 = {キー1 => 値1, キー2 => 値2, キー3 => 値3, ……} のようにして要素を追加することができる。
  • 変数名[キー] のようにして特定の要素を指定できる。
  • あらかじめ用意されているメソッドを使うことで、要素の追加、編集、検索、並べ替え、削除などの操作が行える。