Rubyのuniqメソッドで配列の重複を削除する方法【ブロック・複数条件の使い方も解説】
Rubyのuniqメソッドとは?
Rubyのuniqメソッドを使うと、配列に含まれる重複した要素をすべて取り除くことができます。この記事では、基本的な使い方から、ブロックを活用した応用テクニック、さらに内部の動作原理まで、具体例を交えながらわかりやすく解説します。
基本の使い方
まずは、次のような配列を例に見てみましょう。
n = [1, 1, 1, 2, 3, 4, 5]
この配列では、数値の1が重複しています。
uniqメソッドを呼び出すと、余分な1が取り除かれ、ユニークな要素だけを持つ新しい配列が返されます。
実行例:
n.uniq # [1, 2, 3, 4, 5]
uniqとuniq!の違いに注意
ここで重要なのは、uniqは元の配列n自体を変更しない(非破壊的メソッド)という点です。そのため、結果を保持したい場合は、次のように新しい変数へ代入するか、破壊的バージョンであるuniq!を使用する必要があります。
実行例:
unique_numbers = n.uniq
とてもシンプルですね。
しかし、意外と知られていないのが、uniqにはブロックを渡せるという点です。ブロックを使うことで、より高度な処理が可能になります。順を追って説明していきましょう。
ブロックを使ったuniqメソッドの使い方
uniqメソッドは、内部で配列の各要素をハッシュのキーに変換することで動作しています。ハッシュのキーは必ず一意であるため、そのキーの一覧が、そのまま「重複のない配列」になります。
ポイント:ブロックを渡すことで、「何をもってユニークと判断するか」の基準を自由に変更できます。
具体的な例を見てみましょう:
fruits = %w(orange apple banana)
「orange」と「banana」は、どちらも6文字で文字数が同じです。
ここで、文字列の長さを基準にしてuniqを実行すると…
fruits.uniq(&:size) # ["orange", "apple"]
文字数で比較すると「banana」が重複とみなされるため、配列から除外されます。
別の例:
objects = [1, 2, "a", "b", :c, :d] objects.uniq(&:class)
このように書くと、クラス単位でユニークなオブジェクトだけの配列が得られます。
[1, "a", :c]
この方法の強力さがお分かりでしょうか?
uniqにブロックを渡せば、「何を基準に一意とみなすか」を正確に定義できるのです。
複数条件でuniqを使う方法
uniqは、複数の条件を組み合わせることもできます。
やり方は以下の通りです。
たとえば、age(年齢)、name(名前)、country(国)という属性を持つUserクラスがあるとしましょう。「同じ年齢かつ同じ国の人は1人だけ残したい」というケースです。
ブロックを使えば簡単に実現できます:
[david, petter, raphael].uniq { |person| [person.age, person.country] }
このコードでは、年齢と国の両方の条件が一致した場合のみ重複とみなされます。
内部ではどのように動作しているのか?
ブロックなしの場合、オブジェクト自身がハッシュのキーになります。
一方、ブロックありの場合は、ブロックの戻り値がハッシュのキーとなり、元のオブジェクトがハッシュの値として格納されます。
そして…
Rubyは最終的にハッシュの値を取り出し、それらを新しい配列として返します。
これはあくまで実装上の詳細ですが、仕組みを理解しておくと応用力が高まりますので、ぜひ覚えておきましょう。
まとめ
この記事では、Rubyのuniqメソッドについて学びました。基本的な使い方、uniq!との違い、ブロックによる応用、複数条件での絞り込み、そして内部の動作原理まで網羅的に解説しました。
ぜひ実際にコードを書いて練習し、自分のものにしてください。最後までお読みいただきありがとうございました!
-
Rubyのgrepメソッド徹底解説!使い方とselectとの違いを実例で学ぶ
今回はRubyのgrepメソッドについて詳しく見ていきます。 このメソッドにはどんな便利さがあるのでしょうか? grepを使えば、配列(Array)や範囲(Range)など、Enumerableモジュールを含むオブジェクトから、条件に一致する要素だけを効率よく抽出できます。 「それってselectでも同じことができるのでは?」 確かにそうですが、grepはselectとは異なる仕組みで動作し、得られる結果も異なります。この違いを理解すれば、コードをより簡潔に書けるようになりますよ。 それでは、実際の例を見てみましょう。 Ruby grepメソッドの実例集 まず、次のような配列を用意します。
-
Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説
Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a