Java PriorityQueueの要素の優先度変更に伴う更新について
2023-08-24 07:10:35
質問
私は
PriorityQueue
を使ってオブジェクトを順序付けるために
Comparator
.
これは簡単に達成できますが、オブジェクトのクラス変数(コンパレータが優先順位を計算するもの)は、最初の挿入の後に変更される可能性があります。ほとんどの人は、オブジェクトを削除して値を更新し、再び挿入するという単純な解決策を提案しています。
これを行うために PriorityQueue の周りにラッパー クラスを作成する以外のより良い方法はありますか?
どのように解決するのですか?
キューは、新しい要素が挿入されると適切な位置に置かれることで機能するため、削除と再挿入を行う必要があります。これは、キューから引き出すたびに最も優先度の高い要素を見つけるという代替案よりもはるかに高速です。欠点は、要素が挿入された後に優先順位を変更することができないことです。TreeMapにも同じ制限があります(HashMapも同様で、挿入後に要素のハッシュコードが変更されると壊れます)。
もしあなたがラッパーを書きたいなら、比較コードをenqueueからdequeueに移動させることができます。あなたはもうエンキュー時にソートする必要はないでしょう (変更を許可する場合、それが作成する順序はいずれにせよ信頼できないからです)。
しかし、これはパフォーマンスが悪化します。そして、優先順位のいずれかを変更した場合、キュー上で同期をとりたいものです。優先順位を更新するときに同期化コードを追加する必要があるので、単に dequeue と enqueue を行う方がよいでしょう (両方のケースでキューへの参照が必要です)。
関連
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
maven レポート エラー 解決不可能な親POM
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
代入の左辺は変数でなければならない 解答
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] priorityQueueをmax priorityqueueに変更する。
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Jsoup-Crawlingの動作
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
eclipse にリソースリーク:'in' が閉じない
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
テストが空であるかどうかを判断するためのオプションの処理
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ