Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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!との違い、ブロックによる応用、複数条件での絞り込み、そして内部の動作原理まで網羅的に解説しました。

ぜひ実際にコードを書いて練習し、自分のものにしてください。最後までお読みいただきありがとうございました!

  1. Rubyのgrepメソッド徹底解説!使い方とselectとの違いを実例で学ぶ

    今回はRubyのgrepメソッドについて詳しく見ていきます。 このメソッドにはどんな便利さがあるのでしょうか? grepを使えば、配列(Array)や範囲(Range)など、Enumerableモジュールを含むオブジェクトから、条件に一致する要素だけを効率よく抽出できます。 「それってselectでも同じことができるのでは?」 確かにそうですが、grepはselectとは異なる仕組みで動作し、得られる結果も異なります。この違いを理解すれば、コードをより簡潔に書けるようになりますよ。 それでは、実際の例を見てみましょう。 Ruby grepメソッドの実例集 まず、次のような配列を用意します。

  2. Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説

    Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a