1. ホーム
  2. java

Java PriorityQueueの要素の優先度変更に伴う更新について

2023-08-24 07:10:35

質問

私は PriorityQueue を使ってオブジェクトを順序付けるために Comparator .

これは簡単に達成できますが、オブジェクトのクラス変数(コンパレータが優先順位を計算するもの)は、最初の挿入の後に変更される可能性があります。ほとんどの人は、オブジェクトを削除して値を更新し、再び挿入するという単純な解決策を提案しています。

これを行うために PriorityQueue の周りにラッパー クラスを作成する以外のより良い方法はありますか?

どのように解決するのですか?

キューは、新しい要素が挿入されると適切な位置に置かれることで機能するため、削除と再挿入を行う必要があります。これは、キューから引き出すたびに最も優先度の高い要素を見つけるという代替案よりもはるかに高速です。欠点は、要素が挿入された後に優先順位を変更することができないことです。TreeMapにも同じ制限があります(HashMapも同様で、挿入後に要素のハッシュコードが変更されると壊れます)。

もしあなたがラッパーを書きたいなら、比較コードをenqueueからdequeueに移動させることができます。あなたはもうエンキュー時にソートする必要はないでしょう (変更を許可する場合、それが作成する順序はいずれにせよ信頼できないからです)。

しかし、これはパフォーマンスが悪化します。そして、優先順位のいずれかを変更した場合、キュー上で同期をとりたいものです。優先順位を更新するときに同期化コードを追加する必要があるので、単に dequeue と enqueue を行う方がよいでしょう (両方のケースでキューへの参照が必要です)。