1

両方のエントリが他のペアのエントリよりも厳密に小さい場合はペアが別のペアよりも小さく、両方のエントリが他のペアのエントリよりも厳密に大きい場合は他のペアよりも大きいと見なされる整数のペアを優勢に並べ替えようとしています。ペア。他のすべてのケースは、比類のないものと見なされます。

私がこれを解決したいのはComparator、上記を実装する a を定義することですが、比較できない場合には例外をスローし、それを a に提供しPriorityQueueます。もちろん、ペアを挿入している間、優先キューは新しいエントリをヒープ内の正しい位置までバブリングしながらいくつかの比較を行います。これらの多くは比較できます。ただし、バブリング プロセス中に、この新しいペアとは比較にならないペアが検出され、例外がスローされる場合があります。これが発生した場合、の状態はどうなりますPriorityQueueか? 挿入しようとしていたペアは、例外がスローされる前の最後の位置でヒープに配置されますか? PriorityQueue's remove(Object o)この方法を使用するPriorityQueueと、一貫した状態に復元されますか?

ありがとう

4

1 に答える 1

1

ソースコードを見ると、PriorityQueue新しい要素を追加/提供するときに、.compare()メソッドはtry / catchなしで呼び出されます(これはsiftUpUsingComparator())-これは理にかなっています。これは、比較できない要素をキューに入れないようにするのはPriorityQueueの責任ではないためです。したがって、コンパレータによってスローされたRuntimeExceptionは、呼び出し元のコードにバブルアップします。

ここでのより大きな問題は、なぜあなたはあなたの定義によれば「比類のない」アイテムを分類しようとしているのかということです。これはあまり意味がありません。アイテムが同じタイプであるが、別のアイテムより大きくも小さくもない場合、コンパレータはそれらを等しいものとして返す必要があります。コンパレータのセマンティクスは、「等しい」は「同じ値を持つ」という意味ではなく、「比較される要素の順序が同じ」という意味です。つまり、2つの項目が必要な場合は、等しい(0)を返します。並べ替えで並べて注文します。

于 2010-04-09T11:10:30.817 に答える