【Ruby】レッスン4-06:配列のmapメソッドを理解しよう

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

この記事で学べる知識:mapメソッド

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

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

Rubyの「mapメソッド」とは

この章では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の中に記述します。

基本的な使い方

以下は数値の配列を全て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]

注意点とmapメソッドの特長

  • 非破壊的操作: mapメソッドは元の配列を変更しません。元のデータを保持しつつ、新しい配列を作りたい場合に最適です。
  • eachとの違い: eachメソッドは配列の各要素に処理を実行するだけですが、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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

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

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

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

ヒント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}"

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

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



練習問題の解答と解説

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

正解コードの例

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

# 数字を日本語の形式に変換するメソッド
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}"

正解コードの解説

このコードは数値が入った配列を「〇番目」の形式の文字列に変換するプログラムです。

各部分を分かりやすく解説します。

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

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記事一覧 次のページ>>

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

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

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






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