【Ruby】レッスン4-07:filterメソッドの基本と応用を学ぼう

一つ前のページではmapメソッドについて学習しました。
今回は filterメソッド について見ていきましょう。
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のfilterメソッドの基本|selectとの違いや使い方を学ぼう

Rubyのfilterメソッド
は配列の中から特定の条件を満たす要素だけを取り出し、新しい配列を作成するための便利なメソッドです。
同様の機能を持つselectメソッド
と全く同じ動作をします。
このメソッドを使うことで複雑な条件に基づいたデータの抽出が簡単にできるようになります。
初心者でも理解しやすいように、基本的な使い方から応用例まで詳しく解説します。
filterメソッドの使い方
基本的な使い方
まずはfilterメソッド
の基本的な使用例を見てみましょう。
以下のコードは配列から偶数のみを抽出する例です。
# 配列を定義 numbers = [1, 2, 3, 4, 5, 6] # filterメソッドで偶数を抽出 even_numbers = numbers.filter do |num| num.even? # 偶数かどうかを判定 end # 結果を出力 puts even_numbers.inspect # => [2, 4, 6]
コードの解説
- 配列
numbers
を定義します。 filter
ブロック内ではnum.even?
を使って各要素が偶数かどうかを判定します。- 条件を満たす要素のみが新しい配列
even_numbers
に追加されます。 - 結果として、偶数のみを含む配列が出力されます。
filterメソッドの応用
より複雑な条件
filterメソッド
は複雑な条件にも対応できます。
たとえば10以上の偶数を抽出する例を考えてみましょう。
# 配列を定義 numbers = [5, 10, 15, 20, 25, 30] # 10以上の偶数を抽出 result = numbers.filter do |num| num.even? && num >= 10 # 偶数かつ10以上 end # 結果を出力 puts result.inspect # => [10, 20, 30]
filterメソッドのまとめ
filterメソッド
を使うと配列から条件に合う要素を簡単に抽出できます。
特に次のポイントを覚えておくと便利です。
- 基本的な条件(例:偶数や特定の値以上)を使ったデータの抽出。
- 結果は常に新しい配列として返され、元の配列には影響を与えない。
これを使いこなすことで、Rubyでのデータ操作がさらに楽しく効率的になるでしょう!
練習問題|filterメソッドで条件に合うデータを抽出しよう

filterメソッドをしっかりと身に着けるため、練習問題に挑戦しましょう。
filterメソッドの練習問題
特定の文字で始まる単語だけを抽出するプログラムを作成しましょう。
与えられた単語の配列から、”a”で始まる単語のみを抽出するためにfilter
メソッドを使います。
抽出した単語と元の配列を両方表示してください。
以下の要件に従ってコードを完成させてください。
words
という名前の配列を作成し、以下の単語を格納すること。"apple", "banana", "cherry", "apricot", "blueberry"
filter
メソッドを使用して、"a"
で始まる単語のみを新しい配列に抽出すること。start_with?
メソッドを使用して、各単語が指定の文字(`”a”)で始まるかどうかを判定すること。- 元の配列と抽出した配列をそれぞれ
puts
を使って表示すること。
ただし、以下のような実行結果となるコードを書くこと。
元の配列: ["apple", "banana", "cherry", "apricot", "blueberry"] 'a'で始まる単語: ["apple", "apricot"]
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)1:配列wordsを作成し、”apple”, “banana”, “cherry”, “apricot”, “blueberry”を格納
2:filterメソッドを使用して、words配列から’a’で始まる単語を抽出するブロックを定義
□ start_with?メソッドを使用し、単語が”a”で始まるか判定
3:filterメソッドの結果を変数filtered_wordsに代入
4:「元の配列: 」とwordsの内容を出力
5:「’a’で始まる単語: 」とfiltered_wordsの内容を出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 元の配列を定義 words = ["apple", "banana", "cherry", "apricot", "blueberry"] # filterメソッドを使用して、'a'で始まる単語を抽出 =begin 【穴埋め問題1】 ここにfilterメソッドを使用し、配列wordsから「'a'で始まる単語のみを抽出するブロックを定義するコードを書いてください」。 =end # 結果を表示 puts "元の配列: #{words}" # 元の配列を表示 puts "'a'で始まる単語: #{filtered_words}" # 条件を満たす単語を表示
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# 文字列を要素とする配列を定義 words = ["apple", "banana", "cherry", "apricot", "blueberry"] # filterメソッドを使用して、'a'で始まる単語のみを抽出 filtered_words = words.filter do |word| word.start_with?("a") # 条件:文字列が'a'で始まること end # 結果を表示 puts "元の配列: #{words}" # 元の配列を表示 puts "'a'で始まる単語: #{filtered_words}" # 条件を満たす文字列を表示
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
配列の定義
words = ["apple", "banana", "cherry", "apricot", "blueberry"]
- 配列の定義: 配列
words
を作成し、5つの単語("apple"
,"banana"
,"cherry"
,"apricot"
,"blueberry"
)を格納しています。 - 配列とは?: 配列は複数のデータを一つの変数にまとめて格納できるデータ構造です。ここでは、文字列を要素とする配列を定義しています。
filter
メソッドによる抽出filtered_words = words.filter do |word| word.start_with?("a") # 条件:単語が'a'で始まること end
filter
メソッド: Rubyのfilter
(別名select
)メソッドは、配列の各要素に対してブロックを実行し、ブロックがtrue
を返した要素を新しい配列に抽出します。このコードでは、ブロック内で
word.start_with?("a")
を使い、単語が"a"
で始まるかどうかを判定しています。start_with?
メソッド:start_with?
は、文字列が指定した文字列で始まっているかを判定するメソッドです。例えば、
"apple".start_with?("a")
はtrue
を返しますが、"banana".start_with?("a")
はfalse
を返します。結果の表示
puts "元の配列: #{words}" # 元の配列を表示 puts "'a'で始まる単語: #{filtered_words}" # 条件を満たす単語を表示
puts
メソッド: 標準出力(ターミナルやコンソール)にデータを表示するメソッドです。`”#{}“の中に変数や式を入れると、その値が文字列として展開されます(式展開)。
- 配列の定義: 配列
まとめ
このプログラムではRubyのfilter
メソッドを使って、配列の中から特定の条件を満たす要素を抽出する方法を学びました。
特にfilter
メソッドとstart_with?
メソッドの使い方を理解することで、データの操作を効率的に行えるようになります。
今回の例を応用し、他の条件(例えば、"b"
で始まる単語や、5文字以上の単語を抽出するなど)でも試してみてください。
練習を重ねてRubyの配列操作に慣れていきましょう!
FAQ|Rubyのfilterメソッドの使い方と注意点
- Q1. Rubyのfilterメソッドとselectメソッドに違いはありますか?
-
filterとselectは機能的に同じで、どちらも条件を満たす配列要素だけを抽出します。filterはRuby 2.6以降で追加された比較的新しい別名メソッドであり、読みやすさやチームのコーディングスタイルに応じて使い分けられます。
- Q2. filterメソッドのブロックで複数条件を使いたい場合はどうすればよいですか?
-
複数の条件を組み合わせるには、
&&
や||
などの論理演算子を使います。たとえば「偶数かつ10以上」という条件ならnum.even? && num >= 10
のように記述します。
- Q3. filterメソッドを使って元の配列を変更することはできますか?
-
filterメソッドは非破壊的メソッドであり、元の配列には影響を与えず、新しい配列を返します。元の配列を変更したい場合は、filterの代わりにfilter!(破壊的メソッド)を使用します。