Java の PriorityQueue `toString` メソッドが Comparator によって定義された要素の順序を反映しないのはなぜですか?

DDD
リリース: 2024-11-04 05:04:29
オリジナル
973 人が閲覧しました

Why does Java's PriorityQueue `toString` method not reflect the element order defined by the Comparator?

PriorityQueue の toString メソッドが要素順序の解釈を誤解する仕組み

Java では、PriorityQueue データ構造はバイナリ ヒープを維持し、割り当てられた要素に基づいて要素に優先順位を付けます。比較戦略。この戦略は通常、提供されたコード スニペットに見られるように、カスタム コンパレーターを通じて実装されます。ただし、PriorityQueue の toString メソッドの出力を調べるとき、要素の順序に関してよくある誤解があります。

toString メソッドは、PriorityQueue の内容のテキスト表現を提供するように設計されています。ただし、コンパレータによって定義された優先順位が暗黙的に適用されるわけではありません。代わりに、要素がヒープ内の現在の位置に表示されるだけで、予想される並べ替え順序と一致しない可能性があります。

指定された例では、頻度値に優先順位を付けるために、PriorityQueue がカスタム Comparator で初期化されます。出力ではこの順序を反映し、周波数の低い要素が最初にリストされるようにすることを意図しました。ただし、toString メソッドの出力には間違った順序が表示され、意図した優先度と明らかに矛盾しています。

この矛盾の原因はバイナリ ヒープの内部構造にあります。部分的な順序付けは維持されますが、要素はヒープから削除されるまで完全には並べ替えられません。 toString メソッドは、この並べ替えを実行せずにヒープから要素を直接取得し、出力が観察されます。

この問題に対処し、正しい並べ替え順序を取得するには、PriorityQueue から要素を 1 つずつ抽出する必要があります。 1つ。 poll() メソッドはこれを実行し、ヒープから要素を削除してそれを返します。 poll() を使用して PriorityQueue を反復処理し、返された要素を出力することで、意図したとおりに並べ替えられた順序を取得できます。

したがって、要素を並べ替えられた順序で出力する正しいコードは次のようになります。

<code class="java">while (!queue.isEmpty()) {
   System.out.println(queue.poll());
}</code>
ログイン後にコピー

これにより、コンパレータで定義されたように、要素が頻度の昇順で出力されます。

以上がJava の PriorityQueue `toString` メソッドが Comparator によって定義された要素の順序を反映しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート