こんにちは!エンジニア兼ライターのヤマシタです。
Rubyには配列を操作するためのさまざまなメソッドが用意されています。
今日は配列を使用するにあたって、
「配列の中に同じ値が入っている場合に重複した値を削除したい」
という方に向けて、この記事では
【基礎】数値配列の重複した値を削除する方法
【基礎】文字列配列の重複した値を削除する方法
【発展】uniqでブロックを使う方法
【発展】破壊的メソッドuniq!の使い方
について解説いたします。
uniqメソッドは配列から重複した値を削除するのに非常に便利なメソッドですので、使い方をしっかりと理解しておきましょう!
uniqとは
uniqメソッドは、配列の要素の中に同じ値が合った場合に重複した値を削除するときに使用するメソッドです。
uniqメソッドは以下のように記述します。
配列オブジェクト.uniq
返り値には重複した値を削除した配列が返されます。
uniqの基本的な使い方
ここでは実際にuniqメソッドの使い方を見ていきましょう。
数値配列の場合
以下のサンプルでは、数値が格納された配列からuniqメソッドを使用して重複した値を削除しています。
サンプルプログラム:
array1 = [1, 2, 3, 4, 5, 1, 2, 3] array2 = array1.uniq p array1 p array2
実行結果:
[1, 2, 3, 4, 5, 1, 2, 3] [1, 2, 3, 4, 5]
サンプルプログラムでは数値が格納された配列array1に対してuniqメソッドを使用して、返り値をarray2として取得しています。
実行結果のように、配列array2は重複した値が削除されていることがわかりますね!
文字列配列の場合
uniqメソッドは文字列の重複した値も同様に削除できます。
サンプルプログラム:
fruits1 = [“apple”, “orange”, “melon”, “apple”] fruits2 = fruits1.uniq p fruits1 p fruits2
実行結果:
[“apple”, “orange”, “melon”, “apple”] [“apple”, “orange”, “melon”]
重複した文字列が削除されていることがわかりますね!
uniqでブロックを使う方法
uniqメソッドではブロックを渡してより発展的な使い方をすることができます。
たとえば、uniqメソッドは重複した値でも大文字小文字の区別はできません。
そこで、ブロックで大文字を小文字に変えるdowncaseメソッドをブロック処理で実行すれば、大文字小文字を区別しないで重複した値を削除することが実現可能です。
サンプルプログラム:
fruits1 = ["apple", "orange", "melon", "apple", "ORANGE"] fruits2 = fruits1.uniq {|item| item.downcase } p fruits2
実行結果:
["apple", "orange", "melon"]
uniq!メソッドの使い方
uniqメソッドは元の配列に影響を与えませんが、「!」が付加されたuniq!メソッドを使用すると元の配列を変更することができます。
このように元の値に影響を及ぼすメソッドのことをRubyでは破壊的メソッドと呼びます。
破壊的メソッドはメソッドに「!」が付加されています。
uniqの場合:
array = [1, 2, 3, 4, 5, 1, 2, 3] p array.uniq p array
実行結果:
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5, 1, 2, 3]
uniq!の場合
array = [1, 2, 3, 4, 5, 1, 2, 3] p array.uniq! p array
実行結果:
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
このように破壊的メソッドuniq!の場合は元の配列が変更されていることがわかりますね!
- 元の値を残して置きたい場合はuniq
- 元の値を変更したい場合はuniq!
とおぼえておきましょう。
まとめ
ここではuniqメソッドについて、
- uniqメソッドとは
- 数値配列の重複した値を削除する方法
- 文字列配列の重複した値を削除する方法
- uniqでブロックを使う方法
- 破壊的メソッドuniq!の使い方
などについて解説しました。
実際の開発の現場でも配列から重複した値を削除する場面に出くわすこともありますので、uniqメソッドの使い方は覚えておきましょう。
もし、uniqメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!