Rubyで配列(Array)を操作していると、
「条件に合うものだけを取り除きたい」
「重複をなくしたい」
といった場面に頻繁に遭遇します。
Rubyは、プログラマにとって快適な言語として設計されているため、配列の削除に関するメソッドだけでも数多くの種類が用意されています。
しかし、選択肢が多い分、「結局どれを使えばいいの?」と迷ってしまうことも少なくありません。
また、メソッドによっては元の配列を破壊的に変更してしまうものもあるため、使い分けには注意が必要です。
この記事では、Rubyにおける配列要素の削除方法について、基本的な値指定による削除から、インデックス指定、条件による一括削除、さらには重複や nil の除去まで、現時点でのベストプラクティスをサンプルコード付きで徹底解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
特定の「値」を指定して削除する delete
まずは、配列の中から特定の値を指定して削除する最も基本的な方法です。
delete メソッドを使うと、指定した値と一致するすべての要素が配列から取り除かれます。
deleteメソッドの基本的な使い方
fruits = ["apple", "banana", "orange", "banana", "kiwi"]
# "banana" をすべて削除
removed_item = fruits.delete("banana")
p fruits
puts "削除された要素: #{removed_item}"
実行結果
["apple", "orange", "kiwi"]
削除された要素: banana
delete メソッドの引数に削除したい値を渡すことで、配列内にある一致する要素がすべて消去されます。
このコードでは、"banana" が2つ含まれていましたが、実行後には両方とも削除されていることがわかります。
また、delete メソッドは「削除された要素の値」を戻り値として返します。
もし指定した値が見つからなかった場合は nil が返ります。
「場所(インデックス)」を指定して削除する delete_at
「リストの3番目を消したい」というように、値ではなく要素の位置を指定して削除したい場合は delete_at メソッドを使用します。
delete_atメソッドの使い方
programming_languages = ["Ruby", "Python", "Java", "PHP", "Go"]
# インデックス2(3番目の要素)である "Java" を削除
programming_languages.delete_at(2)
p programming_languages
実行結果
["Ruby", "Python", "PHP", "Go"]
Rubyの配列のインデックスは 0 から始まります。
そのため、delete_at(2) を実行すると、0、1、2番目にあたる3つ目の要素(この例では "Java")が削除されます。
範囲外のインデックスを指定した場合は、何も削除されずに nil が返されます。
先頭や末尾を削除する shift / pop
特定の位置の中でも、「最初」や「最後」を削除したい場合には、専用の高速なメソッドが用意されています。
shift: 配列の先頭の要素を削除して返す。pop: 配列の末尾の要素を削除して返す。
numbers = [1, 2, 3, 4, 5]
first = numbers.shift # 先頭の 1 を削除
last = numbers.pop # 末尾の 5 を削除
p numbers
puts "先頭: #{first}, 末尾: #{last}"
実行結果
[2, 3, 4]
先頭: 1, 末尾: 5
キュー(待ち行列)やスタック構造として配列を扱う場合に非常に便利です。
「条件」に一致する要素を一括削除する delete_if / reject!
「偶数の数字だけを消したい」「文字数が3文字以下の単語を消したい」といった、複雑な条件で削除を行いたい場合は、ブロック付きのメソッドを使用します。
delete_if(または reject!)の使い方
delete_if メソッドは、ブロック内の評価結果が true になった要素をすべて削除します。
これは自分自身を変更する「破壊的メソッド」です。
scores = [55, 80, 45, 90, 30, 75]
# 50点未満のスコアを削除する
scores.delete_if do |score|
score < 50
end
p scores
実行結果
[55, 80, 90, 75]
ブロック変数 |score| に配列の要素が一つずつ渡され、score < 50 という条件式が評価されます。
この条件に合致した(true になった)45 と 30 が配列から削除されました。
なお、reject! もほぼ同じ動作をしますが、変更がなかった場合に nil を返す点が delete_if(常にselfを返す)とは異なります。
元の配列を残したい(非破壊的にしたい)場合は reject(!なし)を使いましょう。
配列から「重複」した要素を取り除く uniq
リストの中に同じデータが複数含まれている場合、それを一つにまとめたいことがあります。
そんな時は uniq メソッドを使います。
uniqメソッドでユニーク(一意)な配列にする
ids = [101, 102, 101, 103, 102, 104]
# 重複を取り除いた新しい配列を作成
unique_ids = ids.uniq
p unique_ids
p ids # 元の配列は変わらない
実行結果
[101, 102, 103, 104]
[101, 102, 101, 103, 102, 104]
uniq メソッドを呼び出すと、重複した値が削除され、各種1つずつだけが残った新しい配列が返されます。
元の配列 ids は変更されていません。
もし元の配列自体を書き換えたい場合は、破壊的メソッドである uniq! を使用してください。
配列から「nil」だけを削除する compact
データベースからの取得結果や、処理の過程で配列の中に nil(値なし)が混ざり込んでしまうことがあります。
これらをきれいに掃除するには compact メソッドが最適です。
compactメソッドの使い方
data = ["A", nil, "B", nil, nil, "C"]
# nil を取り除く
clean_data = data.compact
p clean_data
実行結果
["A", "B", "C"]
compact を使うと、配列内に存在するすべての nil が削除されます。
nil 以外の要素(例えば空文字 "" や 0、false など)は削除されずに残ります。
あくまで nil だけをターゲットにしたメソッドである点に注意しましょう。
こちらも破壊的メソッドの compact! が用意されています。
複数の要素を指定して一括削除する(引き算)
最後に、別の配列を使って「これに含まれる要素を全部消して」という指定をする方法を紹介します。
Rubyでは配列同士の引き算(差集合)が可能です。
マイナス演算子を使った一括削除
all_tags = ["Ruby", "Python", "PHP", "Java", "Go", "Rust"]
remove_tags = ["PHP", "Java"]
# all_tags から remove_tags に含まれる要素を削除
result = all_tags - remove_tags
p result
実行結果
["Ruby", "Python", "Go", "Rust"]
配列A - 配列B と記述することで、配列Aの中から配列Bに含まれる要素をすべて取り除いた新しい配列が生成されます。
非常に直感的で読みやすいコードになるため、特定の除外リストに基づいてフィルタリングしたい場合などに推奨されるテクニックです。
Rubyのスキルを活かして年収を上げる方法
以上、Rubyで配列の要素を削除するメソッドについて解説してきました。
Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



