Java:優先キューから作成されたキューの奇妙な順序

DFS、BFS、A *、ダイクストラ、および欲張りアルゴリズムをサポートするはずの迷路解決プログラムを作成しました。とにかく、フロンティアのデータ構造にPriorityQueueを選択しました。優先順位は、コンパレータの実装に応じてキュー、スタック、または優先キューのように振る舞うことができると思ったからです。

これは、優先キューをキューに変換するためにコンパレータを実装した方法です。

/優先順位キューの「自然順序付け」は先頭に最小の要素があり、最初の要素が2番目の要素より小さい場合、従来のコンパレータは-1を返すため、ハッキングされたコンパレータは常に1を返し、現在の(最後の)正方形が末尾に配置(これは再帰的に動作するはずです)/

public int compare(Square square1, Square square2)
{
    return 1;
}

しかし、迷路の解決策は、BFSを行った後は最適ではありませんでした。

迷路は座標(35,1)で右上隅から始まり、私のプログラムは左、上、下、右の隣をチェックします。
ここに私がやったprintlnがあります:

投票済み(35,1)

追加(34,1)

追加(35,2)

投票済み(34,1)

追加(33,1)

追加(34,2)

投票済み(35,2)

追加(35,3)

投票済み(33,1)

追加(32,1)

追加(33,2)

投票済み(34,2)

追加(34,3)

投票(32,1)

……

前者は後者の前にキューに追加されるため、BFS(35,3)の通知は(32,1)の前にポーリングする必要があります。私を本当に混乱させたのは、データ構造がキューのように振る舞ったことです。すべての新しいメンバーは、キューの先頭に置かれた(32,1)を追加するまで、後ろから追加されました。

私のコンパレーターは、優先順位キューに新しいコーナーを強制的に配置させるべきだと思いました。私にとってさらに奇妙なのは、データ構造の性質がキューから中央のスタックに変わったことです。

皆さんに感謝します。私の貧しい英語についてすみません。
心から
ショーン

ベストアンサー
あなたが比較を実装した方法は間違っており、あなたが仮定している非常に特定の方法でのみ呼び出された場合にのみ機能します。ただし、PriorityQueueが実際に呼び出すコンテキストを比較することはできません。比較関数は、新しい構造ではなく、データ構造内の既存の要素で呼び出される場合があります。

(ソースコードを読んでそれをトレースし、この特定の実装が特定の方法で機能することがわかったとしても、コードを保守可能にしたい場合、それに依存すべきではありません。少なくとも、あなたは自分でなぜ機能するのかを説明する必要があるため、より多くの作業が必要です。)

何らかの種類のカウンターを使用して、追加された各アイテムの値としてそれを割り当て、値に基づいて比較を正しく実装できます。

compareの正しい実装は次のようになります。

int compare(Object x, Object y){
    return x.getSomeProperty() - y.getSomeProperty();
}

パラメータの順序を切り替えると、答えも変わることに注意してください。いいえ、返されるintは必ずしも{-1、0、1}から取得する必要はありません。仕様では、0、または負または正の整数が必要です。正しい記号である限り、任意のものを使用できます。

転載記事の出典を記入してください: Java:優先キューから作成されたキューの奇妙な順序 - コードログ