web-dev-qa-db-ja.com

重複を無視するようにJava優先度付きキューを構成する方法は?

Add()は重複を無視することになっていると思いましたが、出力に重複があります。重複を保存しないようにするにはどうすればよいですか?

また、優先キューが2つの要素が重複しているかどうかを確認する方法も知りたいです。コンパレータequalsを使用していると思いますが、確認したいだけです。

ありがとう

15
sgarg

これが PriorityQueue Javadoc の一部です:

このキューは、使用されるコンストラクターに応じて、自然な順序(Comparableを参照)またはComparatorのいずれかに従って指定された、構築時に指定された順序に従って要素を順序付けます。

そうです、PriorityQueueはComparatorを使用するか(コンストラクター引数として指定した場合)、compareTo(...)メソッドを使用します(要素はComparableインターフェイスを実装する必要があります)。

PriorityQueueは重複を許可します。したがって、それを回避したい場合は、独自のバージョンのQueueを実装する必要があります。非常にエレガントな方法を見つけることができます。その方法は "Effective Java"、page 85 です。または、PriorityQueueクラスを拡張し、addメソッドをオーバーライドすることもできます(これは、contains(...)チェックを配置するのに最適な場所です)。

12

JavaのPriorityQueueには、重複する要素に関する制限はありません。2つの同一のアイテムが同時に優先キューに存在しないようにする場合は、最も簡単な方法は、優先キューと並行して個別のSetを維持することです。優先キューに要素を挿入するたびに、セットに既に含まれているかどうかを確認し、含まれていない場合は、に追加します。セットと優先キューの両方。優先キューから要素を削除するときはいつでも、その要素もセットから削除するだけです。

または、優先度付きキューで実行する予定の操作と、ケースでの同等性の定義方法によっては、代わりに単一のTreeSetに置き換えると、すべてを実行できる場合があります。優先キューでアクセスできる重要な操作ですが、重複は許可されません。

6
Jiddo
import Java.util.PriorityQueue;

public class NoDuplicates<E> extends PriorityQueue<E> 
{
    @Override
    public boolean offer(E e) 
    {
        boolean isAdded = false;
        if(!super.contains(e))
        {
            isAdded = super.offer(e);
        }
        return isAdded;
    }
    public static void main(String args[])
    {
        PriorityQueue<Integer> p = new NoDuplicates<Integer>();
        p.add(10);
        p.add(20);
        p.add(10);
        for(int i =0;i<=2;i++)
        {
            System.out.println(p.poll());
        }

    }
}
4
Raghava

重複を無視するのはセットだけです。リストとキューはそうではありません。 (LinkedListはキューです)

重複を削除したい場合は、take()のエントリが前のものと同じであるかどうかを確認し、無視することができます。好きなように比較できます。 ;)

3
Peter Lawrey

ハッシュセットを作成し、ハッシュセットのオブジェクトを優先度付きキューに渡すことができます。優先度付きキューのコンストラクターの1つは

PriorityQueue q = new PriorityQueue(SortedSet s)

重複せずに優先キューを実装するためのコードは

import Java.util.Comparator;
import Java.util.HashSet;
import Java.util.PriorityQueue;

public class DatabaseConn {

    public static void main(String[] args) {

        HashSet<Integer> s = new HashSet<>();
        s.add(10);
        s.add(20);
        s.add(5);
        s.add(10);

        PriorityQueue<Integer> q = new PriorityQueue<>(s);  
        System.out.println(q);

    }

}
0
Shubham Chopra