Rubyでハッシュに対する繰り返し処理を行うeachの3つのメソッドの使い方

19/01/20 15:39:50     19/05/05 17:13:50

Rubyのeachのメソッド?

ハッシュとは値に対してキーを付与するもので、データの改ざん等を確認するためのものです。ハッシュ関数という手法でハッシュ値を比較し、データのやり取りをしている二者のデータが一致しているかどうかを確認します。

詳細は割愛しますが、興味のある方はぜひ情報処理のテキストを見たりリサーチしてみてください。このページでは、ハッシュに対する繰り返し処理を行うeachの3つのメソッドについて解説します。

eachの3つのメソッドとは

まず3種類のメソッドについてですが、「each」「each_key」」「each_value」の3つになります。メソッド名からなんとなく直感的に役割がわかるかと思いますが、詳細に説明していきます。

eachメソッドの使い方

eachメソッドはHashクラスで用意されているメソッドで、Hashクラスから作成したHashオブジェクトに対して使用します。クラスやオブジェクトの概念がいまいちよくわからないという場合、ぜひ調べてみてください。

eachメソッドを実行するとハッシュに含まれる要素ごとに「キー」と「値」をブロックに渡して処理を行います。文法としては、以下のようになります。

Hashオブジェクト.each{|key, value|
    実行する処理1
    実行する処理2
}

実際に値を入れてみたものが以下です。

scores = { "A" => 50, "B" => 60, "C" => 90, "D" => 40 }
scores.each {|name, score| puts "#{name}\t#{score}" }

このソースコードを実行すると、以下のようにコンソール出力されます。

A 50
D 40
C 90
B 60

ハッシュオブジェクトにまずキーと値をセットで格納し、それをeachメソッドで回していきました。処理内容は、出力です。その結果、キーと値のセットが順次出力されました。

each_keyメソッド

each_keyメソッドもeachメソッドと使い方は同じですが、一点違いがあります。それは、eachメソッドがキーと値をセットで取得するのに対し、each_keyメソッドはキーのみを取得するという点です。

文法は以下のようになります。

オブジェクト.each_key{|key|
    実行する処理1
    実行する処理2
}

サンプルコードは以下です。

scores = { "A" => 50, "B" => 60, "C" => 90, "D" => 40 }
scores.each_key {|name| print "#{name} " }
puts ""

上記のソースコードを実行すると、以下のようにコンソール出力されます。

A D C B

値は取得せずに、キーだけが取得されています。eachメソッドのキーを指定したバージョンなので、eachメソッドがわかっていれば簡単かと思います。

each_valueメソッド

each_valueメソッドも考え方は同じで、取得するものが今度は値になるだけです。文法は以下のようになります。

オブジェクト.each_value{|value|
    実行する処理1
    実行する処理2
}

サンプルコードは以下です。

scores = { "A" => 50, "B" => 60, "C" => 90, "D" => 40 }
scores.each_value {|score| print "#{score} " }
puts ""

上記のソースコードを実行すると、以下のようにコンソール出力されます。

50 40 90 60

値だけが出力されました。

まとめにサンプルコード

以上を踏まえ、「each」「each_key」「each_value」をそれぞれ含むサンプルコードを紹介します。

#! ruby -Ku
require "kconv"

hash = {"vegetable " => 100, "egg" => 150, "meat" => 200}

print(Kconv.tosjis("eachメソッド¥n"));
hash.each{|key, value|
    print(key + "=>", value, "¥n")
}

print(Kconv.tosjis("each_keyメソッド¥n"));
hash.each_key{|key|
    print("key = " + key + "¥n")
}

print(Kconv.tosjis("each_valueメソッド¥n"));
hash.each_value{|value|
    print("value = ", value, "¥n")
}

上記のソースコードを実行すると、以下のようにコンソール出力されます。

eachメソッド
meat=> 200
egg => 150
vegetable=> 100
each_keyメソッド
key = meat
key = egg
key = vegetable
each_valueメソッド
value = 200
value = 150
value = 100

上で紹介してきたことをまとめただけなので、スムーズに理解できるかと思います。

eachメソッドの応用的な使い方

eachメソッドの基本的な使用方法は上で説明してきた通りですが、その他より応用的な使い方もあるので紹介していきます。

each_with_objectを使う方法

ブロックに値を渡して新たな配列を作成することができます。サンプルコードは以下です。

hash = {Cobol: 1, Ruby: 2, Rails: 3 , Swift: 4, Java: 5, PHP: 6}
picked = hash.each_with_object([]) do |(key, value), array_new|
    array_new << key if value >= 4
end
puts picked

上記のソースコードを実行すると、以下のようにコンソール出力されます。

Swift
Java
PHP

valueが4以上のkeyのみを新しい配列に格納するように指定しているため、その通りになっています。each_with_objectは条件指定してハッシュから新たな配列を作るためのメソッドです。

sortを使う方法

sortメソッドを使用することで、ハッシュをkeyでソートすることができます。サンプルコードは以下です。

h = { "def" => 1, "ghi" => 2, "abc" => 3 }
p h.sort
p h

このソースコードを実行すると、以下のようにコンソール出力されます。

[[“abc”, 3], [“def”, 1], [“ghi”, 2]]
{“def”=>1, “ghi”=>2, “abc”=>3}

値ではなくキーでソートされます。

has_key?を使う方法

has_keyメソッドを使用することで、ハッシュにkeyが存在するか確かめることができます。サンプルコードは以下です。

h = { "abc" => 1, "def" => 2, "ghi" => 3 }
if h.has_key? "xyz" then
    p "h has key xyz"
else
    p "h dose not have key xyz"
end

このサンプルコードを実行すると、以下のようにコンソール出力されます。

h dose not have key xyz”

if文で条件分岐していますが、has_key?の戻り値はTrueとfalseになります。戻り値の結果で出力を分けています。

まとめ

以上、ハッシュに対してeachメソッドを使用する方法を解説してきました。eachメソッド自体は3種類あり、他にもハッシュに対して何かしらの処理を加えることのできるメソッドが複数あるということでした。

今回紹介したのは一例で、他にもメソッドはあります。ただしメソッドを使うだけならどれを使ってもさほど難しくはないので、興味のある方や実装に必要な方はぜひざっと調べてみてください。

Rubyのフリーランス案件をチェック

→Rubyの案件情報一覧はこちら

Ruby関連記事
1, Rubyフリーランスの仕事や単価、ruby on railsの在宅案件まで
2, Rubyとは?学習方法や将来性、perlやphp、Pythonの比較はどう?
3, Ruby on RailsでMySQLを使用する際の接続手順
4, あるiOSアプリのエンジニアがRuby on Railsのプロジェクトに加わった話
5, 小学生でも数時間でアプリを作れたRuby on railsの入門書3選
6, 【決定版!】Rubyでできることとは?
7, Ruby開発の新卒採用している会社まとめ
8, Rubyで文字列から数値へ変換する方法まとめ
9, RubyのWebサーバ「puma」を使ってみた感想
10, Rubyでのmecabの使い方を徹底解説します
11, (この記事)Rubyでハッシュに対する繰り返し処理を行うeachの3つのメソッドの使い方
12, Rubyのyardを使ってソースからドキュメントを生成する方法

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する