【Ruby】レッスン4-08:ハッシュを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:ハッシュ

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド(レッスン1~3)配列の基本、配列の操作、配列の調査、配列の並び替え、eachメソッド、mapメソッド、filterメソッド、ハッシュ

<<前のページ Ruby記事一覧 次のページ>>

Rubyの文法「ハッシュ」とは

ここではハッシュの意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Rubyのハッシュはデータを「キー」と「値」のペアで管理するデータ構造です。

配列がインデックス(番号)を使って値を管理するのに対し、ハッシュは任意のキーを使って値を参照できます。

そのためデータの意味をわかりやすく管理したい場合に便利です。

例えばユーザーの情報を管理する場合、名前や年齢などのデータに適切なラベル(キー)を付けて保存できます。

ハッシュの基本的な構造

ハッシュは中括弧 {} を使って定義します。

キーと値はコロン : で区切り、ペアごとにカンマ , で区切ります。以下は基本的なハッシュの例です。

user = { name: "John", age: 25, city: "Tokyo" }

ここでnameagecity がキーで、"John"25"Tokyo" がそれぞれの値です。

このように、キーにはシンボル(例::name)を使用することが一般的です。シンボルは軽量で高速に動作します。

数値や文字列をキーに使用する場合は以下のように、矢印のような記号を作って記述します。

custom_hash = {
  1 => "One",
  "two" => 2,
}

ハッシュの操作

ハッシュにデータを追加したり更新したりするのは簡単です。

以下にいくつかの操作例を示します。

値の取得

キーを指定して値を取得します。

user = { name: "John", age: 25 }
puts user[:name]  # 結果: John

値の追加と更新

新しいキーと値を追加するか、既存のキーを更新できます。

user[:city] = "Tokyo"  # 新しいキーを追加
user[:age] = 30        # 既存のキーを更新

値の削除

delete メソッドを使うと特定のキーと値を削除できます。

user.delete(:age)

ハッシュのメソッド

Rubyのハッシュには多くの便利なメソッドが用意されています。

ここでは主要なメソッドを紹介します。

lengthsize

ハッシュの要素数を取得します。どちらも同じ結果を返します。

user = { name: "John", age: 25 }
puts user.length  # 結果: 2
puts user.size    # 結果: 2

keysvalues

キーだけ、または値だけを取得しま。

user = { name: "John", age: 25 }
puts user.keys    # 結果: [:name, :age]
puts user.values  # 結果: ["John", 25]

key?value?

指定したキーや値が存在するか確認します。

user = { name: "John", age: 25 }
puts user.key?(:name)   # 結果: true
puts user.value?(30)    # 結果: false

まとめ

Rubyのハッシュはデータを整理して管理するのに非常に便利なデータ構造です。

キーと値のペアを使うことで、コードがより読みやすく意味のあるものになります。

これを活用してアプリケーションのデータ構造を効率的に構築しましょう!

Ruby練習問題2-2:ハッシュを使って学生の成績を集計するプログラムを作ろう

学生の成績データをハッシュを使って管理し、それぞれの成績ごとに何人の学生がいるかをカウントするプログラムを作成しましょう。

このプログラムでは、複数の学生の成績を集計し、結果を表示します。

成績データはハッシュとして以下のように与えられます。

students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }

この問題の要件

以下の要件に従ってコードを完成させてください。

  • 学生の名前と成績を管理するハッシュ students を定義し、複数の学生の名前と成績を格納すること。
  • ハッシュ students を使って、それぞれの成績をカウントし、grade_count ハッシュに格納すること。
  • each メソッドを使って、students ハッシュの各要素を繰り返し処理すること。
  • 最後に、grade_count ハッシュに基づいて、それぞれの成績の学生数を表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

成績A: 3人
成績B: 2人
成績C: 1人

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:studentsハッシュを初期化し、各学生の名前と成績を格納
2:grade_countハッシュを初期化し、各成績のカウントを保存する準備
3:studentsハッシュの各要素に対して繰り返し処理を実行
  □ name変数にキー(名前)、grade変数に値(成績)を代入
  □ if文でgrade_countハッシュにgradeキーが存在するかを判定
  □ □ gradeキーが存在する場合、値を1増加
  □ □ gradeキーが存在しない場合、新たにキーを作成し値を1に設定
4:grade_countハッシュの各要素に対して繰り返し処理を実行
  □ grade変数にキー(成績)、count変数に値(人数)を代入
  □ 成績と人数を文字列に整形して出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 学生の成績データ
students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }

# 各成績のカウントを格納するためのハッシュ
grade_count = {}

# ハッシュ内の各成績をカウント
students.each do |name, grade|
=begin 【穴埋め問題1】
  ここに、すでにその成績がカウントされているかを確認し、カウントを増やすか新しいカウントを開始するコードを書いてください。
=end
end

# 各成績の学生の数を表示
grade_count.each do |grade, count|
=begin 【穴埋め問題2】
  ここに、成績とそれに対応する学生の人数を表示するコードを書いてください。
=end
end

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# 学生の成績データ
students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }

# 各成績のカウントを格納するためのハッシュ
grade_count = {}

# ハッシュ内の各成績をカウント
students.each do |name, grade|
  if grade_count[grade]
    # すでにその成績がカウントされている場合は、カウントを増やす
    grade_count[grade] += 1
  else
    # 初めて出現した成績の場合は、カウントを1にする
    grade_count[grade] = 1
  end
end

# 各成績の学生の数を表示
grade_count.each do |grade, count|
  puts "成績#{grade}: #{count}人"
end

正解コードの解説

このRubyコードではハッシュ(Hash) を使って学生の成績を集計しています。

ハッシュはキーと値のペアでデータを管理するための便利なデータ構造です。

コードを順に解説しながら、ハッシュの使い方を学んでいきましょう。

ハッシュの定義

students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }

ここではstudents という名前のハッシュを定義しています。ハッシュでは、キーと値をセットで管理します。

この場合キーは学生の名前で、値はその学生の成績です。

空のハッシュの作成

grade_count = {}

grade_count という空のハッシュを定義しています。

このハッシュは各成績(A, B, Cなど)が何回出現したかをカウントするために使います。

ハッシュの要素を繰り返し処理

students.each do |name, grade|
  if grade_count[grade]
    grade_count[grade] += 1
  else
    grade_count[grade] = 1
  end
end

この部分ではstudents ハッシュを each メソッドで繰り返し処理しています。

name には学生の名前、grade には成績が格納され、それぞれの成績を grade_count ハッシュでカウントします。

if: ここですでに grade_count にその成績が登録されているかをチェックしています。

もし成績がすでに存在していればカウントを1増やし、存在しない場合は初めてその成績が出現したとしてカウントを1に設定します。

結果の表示

grade_count.each do |grade, count|
  puts "成績#{grade}: #{count}人"
end

最後にgrade_count ハッシュを使って、それぞれの成績の学生数を表示しています。

each メソッドを使って、キー(成績)と値(人数)を一つずつ取り出し、puts で表示しています。

まとめ

このプログラムでは、ハッシュ を使って成績データを効率的に集計しています。

ハッシュは、複数のデータをキーと値で管理し、特定のキーに関連する値を簡単に操作することができる非常に便利なデータ構造です。

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyのテキスト&問題集トップへ戻る
    トップページへ戻る