これは、優先キューをキューに変換するためにコンパレータを実装した方法です。
/優先順位キューの「自然順序付け」は先頭に最小の要素があり、最初の要素が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)を追加するまで、後ろから追加されました。
私のコンパレーターは、優先順位キューに新しいコーナーを強制的に配置させるべきだと思いました。私にとってさらに奇妙なのは、データ構造の性質がキューから中央のスタックに変わったことです。
皆さんに感謝します。私の貧しい英語についてすみません。
心から
ショーン
(ソースコードを読んでそれをトレースし、この特定の実装が特定の方法で機能することがわかったとしても、コードを保守可能にしたい場合、それに依存すべきではありません。少なくとも、あなたは自分でなぜ機能するのかを説明する必要があるため、より多くの作業が必要です。)
何らかの種類のカウンターを使用して、追加された各アイテムの値としてそれを割り当て、値に基づいて比較を正しく実装できます。
compareの正しい実装は次のようになります。
int compare(Object x, Object y){
return x.getSomeProperty() - y.getSomeProperty();
}
パラメータの順序を切り替えると、答えも変わることに注意してください。いいえ、返されるintは必ずしも{-1、0、1}から取得する必要はありません。仕様では、0、または負または正の整数が必要です。正しい記号である限り、任意のものを使用できます。
関連記事
転載記事の出典を記入してください: Java:優先キューから作成されたキューの奇妙な順序 - コードログ