【Ruby】レッスン4-06:mapメソッドの使い方と配列操作の基本を学ぼう

50110130

一つ前のページではeachメソッドについて学習しました。

今回は mapメソッド について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド
Lesson4:コレクション

 ・Lesson4-1:配列の基本を理解しよう
 ・Lesson4-2:配列を操作しよう
 ・Lesson4-3:配列を調査しよう
 ・Lesson4-4:配列を並び替えよう
 ・Lesson4-5:eachメソッドを理解しよう
 ・Lesson4-6:mapメソッドを理解しよう ◁今回はココ
 ・Lesson4-7:filterメソッドを理解しよう
 ・Lesson4-8:ハッシュを理解しよう
 ・確認問題4-☆1:ナインゲームを作ろう
 ・確認問題4-☆2:アラビア数字をローマ数字に変換しよう
 ・確認問題4-☆3:トランプをランダムに配ろう
Lesson5:オブジェクト指向編

<<前のページ

Rubyの記事一覧

次のページ>>

mapメソッドとは|配列の各要素に処理を適用して変換しよう

Rubyには配列の各要素を加工して新しい配列を作る便利な方法として「mapメソッド」があります。

例えば数値のリストを全て2倍にしたり、文字列を加工したりする処理を簡潔に記述することが可能です。

本記事では初心者向けにmapメソッドの使い方と応用方法を解説します。

mapメソッドの概要と基本構文を学ぼう

mapメソッドは配列の各要素に特定の処理を適用し、その結果を元に新しい配列を作るためのメソッドです。

このメソッドを使うことでコードを短く、読みやすく書くことができます。

以下に一般的な構文を示します。

arr = [1, 2, 3, 4, 5]
new_arr = arr.map do |element|
  # 各要素に適用する処理
end
  • 元の配列arrは変更されず、新しい配列new_arrが返されます。
  • 処理内容はdo ... endの中に記述します。

シンプルな処理を例にmapの使い方を体験

以下は数値の配列を全て2倍に変換する例です。

# 元の配列
numbers = [1, 2, 3, 4, 5]

# mapメソッドを使用して各要素を2倍にする
doubled_numbers = numbers.map do |number|
  number * 2
end

# 結果を表示
p doubled_numbers  # => [2, 4, 6, 8, 10]
  • numbers配列にmapを呼び出します。
  • numberは配列内の各要素を表し、number * 2で各要素を2倍にしています。
  • 結果として元の配列numbersは変更されず、新しい配列doubled_numbersが生成されます。

条件分岐や計算など応用例で理解を深めよう

条件付きの処理

例えば奇数を「奇数」、偶数を「偶数」と文字列に変換する処理を行うことも可能です。

numbers = [1, 2, 3, 4, 5]

result = numbers.map do |number|
  if number.odd?
    "奇数"
  else
    "偶数"
  end
end

p result  # => ["奇数", "偶数", "奇数", "偶数", "奇数"]

簡潔な書き方(ブロック記法を使う)

1行で記述する場合は以下のように{}を使用します。

numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.map { |number| number ** 2 }
p squared_numbers  # => [1, 4, 9, 16, 25]

非破壊的処理やeachとの違いに注意しよう

  • 非破壊的操作: mapメソッドは元の配列を変更しません。元のデータを保持しつつ、新しい配列を作りたい場合に最適です。
  • eachとの違い: eachメソッドは配列の各要素に処理を実行するだけですが、mapメソッドは処理後の結果を収集して新しい配列を返します。

まとめ

mapメソッドを使うと配列の加工を簡単に記述でき、処理の結果を新しい配列として取得できます。

特に数値の変換や文字列の加工といった操作で力を発揮します。

次回はさらにmapメソッドの発展的な使い方として、複雑な条件を扱うケースを取り上げていきます。

ぜひ自分のコードに取り入れてみてください!

練習問題|mapメソッドで配列要素を加工・変換しよう

mapメソッドをしっかりと身に着けるため、練習問題に挑戦しましょう。

要素を文字列に変換するmapの練習問題

配列内の数字を「〇番目」という形式の文字列に変換するプログラムを作成しましょう。

例えば元の配列が [1, 2, 3, 4, 5] の場合、それぞれの要素を「1番目」「2番目」… のように文字列に変換し、新しい配列を作ります。

このプログラムを通じてmap メソッドの使い方を学びます。

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

  • convert_numbers_to_strings という名前のメソッドを定義すること。
  • このメソッドは、配列を引数として受け取り、map メソッドを使って配列の各要素を「〇番目」の形式に変換し、新しい配列を返すこと。
  • 元の配列は [1, 2, 3, 4, 5] とすること。
  • メソッドを呼び出し、その結果を画面に出力すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

元の配列: [1, 2, 3, 4, 5]
変換後の配列: ["1番目", "2番目", "3番目", "4番目", "5番目"]

【ヒント】自力で解くのが難しい人へ

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

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

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

1:convert_numbers_to_stringsメソッドを定義
  □ mapメソッドを使い、配列の各要素を新しい配列に変換
  □ □ 各要素を文字列形式「〇番目」に変換
  □ 変換後の新しい配列を返す
2:配列numbers_arrayに数値のリストを代入
3:convert_numbers_to_stringsメソッドを呼び出し、結果をstrings_arrayに代入
4:「元の配列: #{numbers_array}」と出力
5:「変換後の配列: #{strings_array}」と出力

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

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

# 数字を日本語の形式に変換するメソッド
def convert_numbers_to_strings(array)
  # mapメソッドを使用して、配列の各要素を文字列に変換
=begin
  【穴埋め問題1】
  ここでmapメソッドを使用して、新しい配列を生成し、各要素を文字列「〇番目」の形式に変換するコードを書いてください。
=end
  return new_array # 新しい配列を返す
end

# 入力用の配列を作成
numbers_array = [1, 2, 3, 4, 5] # 元の配列

# メソッドを呼び出して処理を実行
strings_array = convert_numbers_to_strings(numbers_array)

# 結果を出力
puts "元の配列: #{numbers_array}"
puts "変換後の配列: #{strings_array}"

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

この問題の解答例と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
# 数字を日本語の形式に変換するメソッド
def convert_numbers_to_strings(array)
  # mapメソッドを使用して、配列の各要素を文字列に変換
  new_array = array.map do |element|
    "#{element}番目" # 数字を「〇番目」の形式にする
  end
  return new_array # 新しい配列を返す
end

# 入力用の配列を作成
numbers_array = [1, 2, 3, 4, 5] # 元の配列

# メソッドを呼び出して処理を実行
strings_array = convert_numbers_to_strings(numbers_array)

# 結果を出力
puts "元の配列: #{numbers_array}"
puts "変換後の配列: #{strings_array}"
Q
正解コードの解説

コードをブロックごとに分割して解説します。

数字を日本語形式に変換するメソッドの定義

def convert_numbers_to_strings(array)
  • def はメソッドを定義するキーワードです。
  • convert_numbers_to_strings という名前のメソッドを作成しています。
  • 引数 array を受け取ります。この配列が変換の対象です。

配列の各要素を変換

new_array = array.map do |element|
  "#{element}番目"
end

array.map は、Rubyで非常に便利な「繰り返し処理」を行うメソッドです。

  • 配列の各要素に処理を適用し、新しい配列を生成します。
  • 各要素を「〇番目」という文字列に変換する処理を記述しています。
mapメソッドのポイント
  • map メソッドは、配列の各要素を変換し、新しい配列を作るためのツールです。
  • ブロック { |element| ... } または do ... end の中で、各要素 (element) に適用する処理を指定します。
  • このコードでは、"#{element}番目" のように文字列補間を使って数値を「〇番目」という形式にしています。

例えば[1, 2, 3].map { |element| "#{element}番目" } の結果は ["1番目", "2番目", "3番目"] になります。

結果を返す

return new_array

return はメソッドの戻り値を指定します。この場合新しく作られた配列 new_array を返します。

入力用の配列を作成

numbers_array = [1, 2, 3, 4, 5]
  • numbers_array に [1, 2, 3, 4, 5] という配列を代入します。
  • この配列がメソッドに渡され、変換の対象になります。

メソッドの呼び出しと実行

strings_array = convert_numbers_to_strings(numbers_array)
  • ここで定義したメソッド convert_numbers_to_strings を呼び出します。
  • 引数として numbers_array を渡し、その結果を strings_array に代入します。

結果を出力

puts "元の配列: #{numbers_array}"
puts "変換後の配列: #{strings_array}"
  • puts はコンソールにメッセージを出力するメソッドです。
  • "#{numbers_array}" のように変数を埋め込むことで、配列の内容を表示します。

まとめ

このプログラムではRubyの map メソッドを使って配列の各要素を「〇番目」の形式に変換する方法を学びました。

  • map メソッドの使い方とブロックの構造。
  • 配列の操作とメソッドの使い方の組み合わせ。

このコードは簡潔で実用的な内容ですので、ぜひ他の変換処理にも挑戦してみてください!

例えば数字を日本語で「一、二、三」のように変換するなど、学びを深める課題に進んでみてください。

<<前のページ

Rubyの記事一覧

次のページ>>

FAQ|Rubyのmapメソッドの使い方と特徴

Q
Q1. Rubyのmapメソッドは元の配列を変更しますか?

いいえ、Rubyのmapメソッドは非破壊的なメソッドです。元の配列は変更されず、新しい配列が生成されるため、元データを保持しながら加工処理が可能です。

Q
Q2. mapメソッドで複雑な条件を指定することはできますか?

はい、mapメソッドのブロック内でif文などの条件分岐を使えば、各要素に対して異なる処理を適用できます。条件に応じて文字列や数値を変換する処理も記述可能です。

Q
Q3. map!メソッドとの違いは何ですか?

map!メソッドは破壊的メソッドで、元の配列そのものを変更します。mapと違い、新しい配列は返さず、元の配列を上書きするため注意が必要です。元配列の変更を意図している場合に使用します。

記事URLをコピーしました