2017-11-17 13 views
-2

重複を避けるためにSetでどのアルゴリズムが使用されていますか?
私も重複し、可能な場合は同じアルゴリズムの実装を回避するために使用されるアルゴリズムの名前であるだけでは何を知りたいです。重複を避けるためにどのアルゴリズムがSetで使用されていますか?

+6

が、私は 'Set'サブクラスのコードで –

+0

だけでダイビングを言うだろうか' Set'実装に依存...あなたはそこに論理を見つけるでしょう。 – AxelH

+0

一歩を踏み出し、インタフェースとクラスの違いを把握し、[documentation](https://docs.oracle.com/javase/8/docs/api/java/util)に移動してください。 /Set.html)(必要な情報はすべてそこにあります)。 – Dukeling

答えて

0

これはSet実装に依存します。 Setは、クラスを実装するメソッドと一般的な動作を定義する単なるインタフェースです。このクラスがどのようにエントリの一意性を保証するかは、このクラスの実装によって異なり、かなり異なる場合があります。

一部の実装では、バイナリ検索を使用して既存のエントリをすばやく見つけることができます。他のクラスは愚かであり、エントリが既に存在するかどうかを調べるためにすべてのエントリを反復処理します。

1

アルゴリズムが、ここで発見されました。 https://homepages.inf.ed.ac.uk/wadler/gj/doc/java.util.Set.html#add(A)

それは(任意のオペレーション)が既に存在しない場合、このセットに指定された要素を追加します。より正式には、(o == null?e == null:o.equals(e))のような要素eがセットに含まれていない場合、指定された要素oをセットに追加します。 Setに指定された要素がすでに含まれている場合、呼び出しはSetを変更しないままにします(falseを返します)。コンストラクタの制限と組み合わせて、Setには重複する要素が含まれないようにします。

+0

オプションの部分は、前の部分を上書きしないことです。 (o == null?e == null:o.equals(e)) " –

+0

私は修正されました、ありがとうございます。 –

0

HashSetの実装では、データとしてHashMapを持っています。

add(E e)がmap.put(e、DUMMY)を呼び出すのは、HashMap実装がキー一意性のためにobejct hashCode()メソッドとequals()メソッドに依存するため、前のものと等しくなります。

このセットの実装はここで見ることができます: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashSet.java

+0

この回答は完全ではなく、完全ではありません。ハッシュコードだけではありません。 'hashCode()'と 'equals()'を見ます。ハッシュコードは一意のキーではないことに注意してください。異なるオブジェクトは同じハッシュコードを持つことがあります。 – Jesper

関連する問題