カテゴリ: Ruby 更新日: 2026/02/12

Rubyの配列とSetを使いこなす!重複データを消すユニーク化の決定版

配列→Set→配列でユニーク化:ユースケース別ベストプラクティス
配列→Set→配列でユニーク化:ユースケース別ベストプラクティス

先生と生徒の会話形式で理解しよう

生徒

「Rubyで名簿を作っているのですが、同じ名前が何度も出てきて困っています。ダブりだけを綺麗に消す方法はありますか?」

先生

「ありますよ!プログラミングでは、重複を消して中身を一つずつにすることを『ユニーク化』と呼びます。」

生徒

「ユニーク化、なんだかカッコいい響きですね。配列をそのまま加工すればいいのでしょうか?」

先生

「配列(Array)のままでもできますが、データ量が多いときは『Set(集合)』という道具を経由するのがプロの技なんです。その仕組みを詳しく解説しますね!」

1. ユニーク化(重複排除)とは何か?

1. ユニーク化(重複排除)とは何か?
1. ユニーク化(重複排除)とは何か?

Rubyのプログラムを作っていると、データの集まりの中に同じ値が混ざってしまうことがよくあります。例えば、アンケート結果のリストや、商品の閲覧履歴などです。これらの中から、重複しているものを取り除き、種類ごとに一つだけの状態にすることをユニーク化、あるいは重複排除と呼びます。

パソコンを触ったことがない方にとって、「ユニーク」という言葉は「面白い」という意味に聞こえるかもしれませんが、コンピュータの世界では「唯一無二の」「重なりのない」という意味で使われます。バラバラに散らばったカードの中から、同じ種類のカードを重ねて整理整頓する作業をイメージしてみてください。これができると、データ分析や名簿管理がぐっと楽になります。

2. 最も簡単な方法:配列の uniq メソッド

2. 最も簡単な方法:配列の uniq メソッド
2. 最も簡単な方法:配列の uniq メソッド

Rubyで一番手軽に重複を消す方法は、配列が最初から持っている uniq(ユニーク)という命令を使うことです。これは、配列の箱の中から同じ中身を探し出して、余分なものを捨ててくれるとても親切な機能です。

プログラミング未経験の方は、まずはこの方法から覚えるのが一番の近道です。特別な準備もいらず、一行書くだけで魔法のようにデータがスッキリします。以下のコードを見てみましょう。


# 同じ果物の名前が混ざった配列
fruits = ["りんご", "みかん", "りんご", "ぶどう", "みかん"]

# uniqメソッドで重複を消す
unique_fruits = fruits.uniq

puts "元の配列: #{fruits.inspect}"
puts "整理後: #{unique_fruits.inspect}"

実行結果は以下の通りです。


元の配列: ["りんご", "みかん", "りんご", "ぶどう", "みかん"]
整理後: ["りんご", "みかん", "ぶどう"]

このように、順番を保ったまま重複だけが消えています。inspect(インスペクト)という命令は、配列の中身を分かりやすく表示するために使っています。

3. なぜ「Set」を使う必要があるのか?

3. なぜ「Set」を使う必要があるのか?
3. なぜ「Set」を使う必要があるのか?

uniq があるなら、それだけで十分じゃない?」と思うかもしれません。しかし、扱うデータが数万件、数百万件と増えてくると、配列の uniq は少し時間がかかるようになってしまいます。そこで登場するのが Set(集合) というデータ型です。

配列(Array)は「何番目に何があるか」を覚えるのが得意ですが、Setは「何が入っているか」を管理するのが専門です。Setは設計上、最初から「同じものは絶対に入れない」という頑固なルールを持っています。そのため、大量のデータを扱うとき、Setに変換するだけで超高速に重複を消し去ることができるのです。これを専門用語で「計算効率が良い」と言ったりします。

4. 実践!配列 → Set → 配列 の変換フロー

4. 実践!配列 → Set → 配列 の変換フロー
4. 実践!配列 → Set → 配列 の変換フロー

それでは、プロがよく使う「一度Setに変えてから配列に戻す」という黄金のパターンを試してみましょう。この方法を使うには、まず require 'set' という一文を書いて、Setという便利な道具箱を使えるように準備します。

手順は3ステップです。
1. 配列を用意する
2. to_set でSetに変換する(ここで重複が消える)
3. to_a で配列に戻す


require 'set'

# 大量の(想定の)ユーザーIDリスト
user_ids = [101, 102, 101, 103, 102, 104]

# Setに変換して重複を消し、また配列に戻す
unique_ids = user_ids.to_set.to_a

puts "ユニーク化されたID: #{unique_ids.inspect}"

実行結果は以下の通りです。


ユニーク化されたID: [101, 102, 103, 104]

to_set は「セットへ」、to_a は「配列(アレイ)へ」という意味です。この「型変換」を覚えると、Rubyの操作がより自由自在になります。

5. 注意点:Setに変えると「順番」が崩れる?

5. 注意点:Setに変えると「順番」が崩れる?
5. 注意点:Setに変えると「順番」が崩れる?

配列とSetの大きな違いの一つに「順番を守るかどうか」があります。以前のRubyでは、Setに変換するとデータの順番がバラバラになってしまうことがありました。今のRubyでは基本的には順番が維持されますが、プログラミングの世界では「Setは順番を保証しないもの」と考えておくのが安全な設計のコツです。

もし、「絶対に最初に入れた順番を守りたい!」という場合は、配列の uniq を使うのがベストです。逆に「順番はどうでもいいから、とにかく速く、確実に重複を消したい」という場合は、Setを使うのがベストプラクティス(最善策)となります。このように、目的に合わせて道具を使い分けるのが上達の秘訣です。

6. ユースケース別:どちらを使うべきかの判断基準

6. ユースケース別:どちらを使うべきかの判断基準
6. ユースケース別:どちらを使うべきかの判断基準

初心者の方が迷わないように、使い分けの基準を整理しました。どちらを使えばいいか迷ったときは、この表を思い出してください。

やりたいこと おすすめの方法 理由
少量のデータを手軽に整理したい 配列の uniq 書き方が簡単で、順番も守られるから
数十万件以上の膨大なデータがある to_set.to_a 処理スピードが圧倒的に速いから
常に重複がない状態をキープしたい 最初から Set を使う 後で消す手間が省け、ミスがないから

7. 応用:複数の配列を合体させてユニーク化

7. 応用:複数の配列を合体させてユニーク化
7. 応用:複数の配列を合体させてユニーク化

Setの真価が発揮されるのは、二つのリストを合体させるときです。例えば「昨日の来場者リスト」と「今日の来場者リスト」を合わせて、「二日間の合計来場者数(重複なし)」を出したい場合です。Setを使えば、数学の「集合」と同じように直感的な計算ができます。

[Image of Venn diagram for union of two sets]

記号の +(プラス)ではなく、|(縦棒:パイプ)という記号を使うのがポイントです。これは「和集合」という計算を意味します。


require 'set'

monday_members = ["田中", "佐藤"]
tuesday_members = ["佐藤", "鈴木"]

# 二つの配列を合体させつつ、重複を消す
all_members = monday_members.to_set | tuesday_members.to_set

puts "全来場者(重複なし): #{all_members.to_a.inspect}"

実行結果は以下の通りです。


全来場者(重複なし): ["田中", "佐藤", "鈴木"]

「佐藤さん」は両日に来ていますが、結果では一人としてカウントされていますね。これを配列の足し算で行うと「佐藤さん」が二人になってしまいます。Setを賢く使うことで、データの正確性が守られるのです。

8. 初心者がハマるポイント:requireを忘れずに

8. 初心者がハマるポイント:requireを忘れずに
8. 初心者がハマるポイント:requireを忘れずに

最後にもう一度、大切な注意点をお伝えします。RubyでSetを使おうとして to_set と書いたのに、「エラーが出て動かない!」となる原因の9割は、一番上の require 'set' を書き忘れていることです。

配列や数値、文字列などは、Rubyを立ち上げればすぐに使える「標準の道具」ですが、Setは「倉庫に保管されている少し特別な道具」です。使うときには必ず「倉庫から出してきて!」という合図(require)が必要になります。パソコンの電源を入れるのと同じくらい大切な手順ですので、セットを扱うときは必ずセットで書く習慣をつけましょう!

関連記事:
カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.7
Java&Spring記事人気No7
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説