Add()は重複を無視することになっていると思いましたが、出力に重複があります。重複を保存しないようにするにはどうすればよいですか?
また、優先キューが2つの要素が重複しているかどうかを確認する方法も知りたいです。コンパレータequalsを使用していると思いますが、確認したいだけです。
ありがとう
これが PriorityQueue Javadoc の一部です:
このキューは、使用されるコンストラクターに応じて、自然な順序(Comparableを参照)またはComparatorのいずれかに従って指定された、構築時に指定された順序に従って要素を順序付けます。
そうです、PriorityQueueはComparatorを使用するか(コンストラクター引数として指定した場合)、compareTo(...)メソッドを使用します(要素はComparableインターフェイスを実装する必要があります)。
PriorityQueueは重複を許可します。したがって、それを回避したい場合は、独自のバージョンのQueueを実装する必要があります。非常にエレガントな方法を見つけることができます。その方法は "Effective Java"、page 85 です。または、PriorityQueueクラスを拡張し、addメソッドをオーバーライドすることもできます(これは、contains(...)チェックを配置するのに最適な場所です)。
JavaのPriorityQueue
には、重複する要素に関する制限はありません。2つの同一のアイテムが同時に優先キューに存在しないようにする場合は、最も簡単な方法は、優先キューと並行して個別のSet
を維持することです。優先キューに要素を挿入するたびに、セットに既に含まれているかどうかを確認し、含まれていない場合は、に追加します。セットと優先キューの両方。優先キューから要素を削除するときはいつでも、その要素もセットから削除するだけです。
または、優先度付きキューで実行する予定の操作と、ケースでの同等性の定義方法によっては、代わりに単一のTreeSet
に置き換えると、すべてを実行できる場合があります。優先キューでアクセスできる重要な操作ですが、重複は許可されません。
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());
}
}
}
重複を無視するのはセットだけです。リストとキューはそうではありません。 (LinkedListはキューです)
重複を削除したい場合は、take()のエントリが前のものと同じであるかどうかを確認し、無視することができます。好きなように比較できます。 ;)
ハッシュセットを作成し、ハッシュセットのオブジェクトを優先度付きキューに渡すことができます。優先度付きキューのコンストラクターの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);
}
}