Search

検索したいワードを入力してください

2019年03月07日

Rubyのuniqメソッドを使って重複した値を削除する方法

プログラミングをしていると、配列に含まれる重複データを排除して、一意のデータだけで配列を再構成したい局面が多々あります。Rubyで開発を行う際は、このようなときにuniqメソッドが使えます。本記事では、Rubyのuniqメソッドの使い方についてご紹介します。

Rubyのuniqメソッドを使って重複した値を削除する方法

Rubyのuniqメソッドとは

Rubyで使えるuniqメソッドは、配列内の要素の重複を排除するメソッドです。配列の要素の中に同じ値があれば、重複した値を削除して配列を再構成します。uniqメソッドは次のように記述します。

【コード記述例】
次の「array」は配列オブジェクトを表しています。
array2=array.uniq

上記のコード記述例では、array配列の要素値で重複した値が取り除かれた配列がarray2にセットされます。

distinctメソッドとの違い

distinctは、重複する値をひとまとめにしてくれるメソッドです。データベースアクセスのSQL文でよく使われますが、Rubyのメソッドとしても存在します。得られる結果はuniqとdistinctで同じと考えて問題ありません。

uniqとdistinctでは、仕様として注意すべき違いがあります。uniqメソッドは、Ruby on Rails5以降では非推奨のメソッドもしくは、使用不可となります。

Rubyのuniqメソッドを使って重複した値を削除する方法

Rubyのuniqメソッドの基本構文は「配列.uniq」です。実際に使用する局面をイメージして、uniqの使い方を覚えましょう。

重複データが発生してしまい、重複を排除して一意のデータを作り上げたいという場面は、プログラミングの中で結構発生します。ここで扱うデータの種類は数値の場合も文字列の場合もあります。

ここでは、uniqメソッドによる重複排除の方法が、数値型と文字型とで異なるのか見てみましょう。

数値配列から削除する場合

数値配列の重複排除する例としては、テスト結果表をもとに、得点分布を作成するために、得点数をピックアップする場合などを想定してみましょう。テスト結果を見ながら順に配列の中に記録していくと、重複する値が記録されることになります。

配列が、[10,9,3,4,5,3,8,2,10,2]になったと仮定しましょう。この配列をuniqメソッドを使用して、重複した値を排除し、存在する得点の種類に絞り込みます。

コード記述と実行結果(例)

例示した配列[10,9,3,4,5,3,8,2,10,2]の要素数は10です。この配列に対し、uniqメソッドを実行すると、要素が7つに減ります。

uniqメソッドを実行した、以下の実行結果では、もとの配列とuniqメソッド実行後の配列が2行に渡り表示されています。uniqメソッドにより、重複データが3つ取り除かれていることを確認しましょう。

コード記述・実行結果(例)
【コード記述例】
array1 = [10,9,3,4,5,3,8,2,10,2]
array2 = array1.uniq
p array1
p array2
【実行結果】
[10,9,3,4,5,3,8,2,10,2]
[10,9,3,4,5,8,2]

文字配列から削除する場合

文字配列にuniqメソッドを使う場合も、使い方として特に数値配列と異なる点はありません。配列.uniqという基本構文に沿った指定で、文字列(単語)重複排除も実装可能です。

サンプルとして、クラスメイトの名前をピックアップした配列を考えてみましょう。["shohta","hina","daichi","misaki","hina","misaki","shota"]という配列になったと仮定します。

コード記述と実行結果(例)
【コード記述例】
name1=["shota","hina","daichi","misaki","hina","misaki","shota"]
name2=name1.uniq
p name1
p name2
【実行結果】
["shota","hina","daichi","misaki","hina","misaki","shota"]
["shota","hina","daichi","misaki"]

大文字と小文字を区別せず重複排除する

文字配列の中から、重複データを取り除く場合、Rubyのuniqメソッドでは大文字と小文字は異なる文字列だと認識されます。つまり、["AAA","aaa"]という配列は、uniqメソッドを使っても、重複は発見されず、["AAA","aaa"]という配列が戻されます。

大文字と小文字の区別なく、同じ単語として重複データとみなしたい場合は、uniqメソッドにブロックを渡して、少し高度な使い方ができます。

uniqにブロックを渡し発展的な処理を行う

単にuniqメソッドを使うだけでは、大文字と小文字を区別してしまうため、実質的な重複排除は行われず、もとの配列と同じ配列が戻されます。

大文字を小文字に換えるdowncaseメソッドを使ったブロック処理をuniqメソッドに渡すコード記述を考えます。

例示したブロック処理を追加すると、要素の値すべて小文字に変換したうえで値の比較が行われます。配列から重複が排除され、値も小文字に変換されています。

コード記述・実行結果(例)
【コード記述】
array1= ["AAA", "BBB", "AaA", "bBb", "aaa"]
array2= array1.uniq
array3= array1.uniq {|item| item.downcase }
p array1
p array2
p array3
【実行結果】
["AAA", "BBB", "AaA", "bBb", "aaa"]
["AAA", "BBB", "AaA", "bBb", "aaa"]
["aaa", "bbb"]

Rubyのuniqメソッドの注意点

Rubyのuniqメソッドは、特に難しいメソッドではなく、一般的なメソッドと同じ指定の仕方で、簡単・便利に使えるメソッドです。しかし、uniqメソッドについては、使い方以外の点で、注意しておくべき事項があるので、頭の片隅に置いておきましょう。

uniqメソッドには、末尾に「!」マークが付いただけの違いの「uniq!メソッド」があります。構文など、使い方も同じですが、処理は異なるので注意が必要です。

類似メソッド「uniq!」

Rubyのuniqメソッドを使う場合は、もとの配列の要素に影響を与えることがないので、もとの配列はuniqメソッド使用後も、最初の配列と同じ状態で使用可能です。つまり、[1,2,2,3,3,3]という配列は、[1,2,2,3,3,3].uniq実行後も[1,2,2,3,3,3]のままです。

しかし、よく似ているuniq!メソッドは、もとの配列を書き換えてしまいます。以下の実行結果を参照してください。

uniqメソッドuniq!
コード記述array=[1,2,2,3,3,3]
p array.uniq
p array
array=[1,2,2,3,3,3]
p array.uniq!
p array
実行結果[1,2,3]
[1,2,2,3,3,3]
[1,2,3]
[1,2,3]

uniqメソッドはRails5以降で非推奨

uniqメソッドは、Ruby on Rails5以降では非推奨となります。非推奨ということで動作も補償されないことになるので、Railsを使ってアプリケーション開発を行う場合は、uniqメソッドではなくdistinctメソッドを使うことが推奨されています。

uniqが使えなくなるのは、RubyのフレームワークであるRailsを使う場合なので、Railsを使わずに開発する場合は、問題ありません。

Rubyのuniqメソッドを活用しましょう

プログラミングをしていると、取得したり生成したりしたデータから、重複を除きたいという状況がよくあります。

データベースからのデータ取得時に、重複データを除く場合は、SQL文で重複排除を行えます。プログラムの中でもつ配列から重複を除きたいときは、uniqメソッドが便利です。

uniqメソッドには、使用上の注意事項もありますが、Rubyのプログラミングでは使いやすいメソッドなので、覚えて活用しましょう。

多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related