マンハッタン距離に基づいて、(x、y)平面上の特定の位置に最も近いn個のイベントを見つけるアプリケーションを実装しています。 私は最大のPriorityQueueを使用して、見つかったイベントをマンハッタン距離比較器で保存しています。このキューは常に最大のmanDistanceイベントを持つ必要がありますが、これは常に発生するわけではありません。 ループ内でpq.poll()を使用してこのキューの結果を表示しましたが、削除後にキューが再配置されないことがありました。Javaプライオリティキューは変わった動作をします
マイコンパレータ:メインメソッドで
public class LocationComparator implements Comparator<Event> {
private double xCord,yCord;
public LocationComparator(double x,double y){
xCord=x;
yCord=y;
}
@Override
public int compare(Event x,Event y){
double xManDist=Math.abs(x.getxCord()-xCord)+Math.abs(x.getyCord()-yCord);
double yManDist=Math.abs(y.getxCord()-xCord)+Math.abs(y.getyCord()-yCord);
return (int)(yManDist-xManDist);
}
}
印刷、それを:
System.out.println(MessageFormat.format("Closest Events to location {0},{1}",x,y));
while (!(events.isEmpty())){
Event temp=events.poll();
System.out.println(temp);
System.out.println(temp.calcManDistance(x, y));
出力:あなたが見ることができるように
Closest Events to location 0,0
name: Event 5
x: 3.43
y: -4.97
8.398549367213874
name: Event 10
x: -8.98
y: -0.49
9.469052759377341
name: Event 3
x: -0.77
y: 7.92
8.693576027826397
name: Event 2
x: -0.57
y: -6.56
7.127381509823561
name: Event 6
x: -0.56
y: -3.38
3.935261527783056
、イベントが降順ではありません!しかし、時々彼らはそうです。私はこの一貫性のない行動を引き起こす原因を追跡することはできません。何か不足していますか?
この場合、このメソッド内でキューを生成しています。 最小優先度キューから自分のイベントを取得します。peekイベントはx軸上の最も近いイベントでなければなりません。次に、サイズが5より小さい場合は、最も近いイベントを保持するmaxPriorityQueueに追加します。そのpeek manDistanceは、イベントに比べて高いです。私がmaxPriorityQueueからpeekイベントのmanDistanceよりも高いxのイベントに到達した場合、最も近い5つのイベントが見つかりました。
pqTemp - PEEKは、PEEKが最大マンハッタン距離を持つイベントである
manDistanceFarthest --holds現在の最も近いイベントX軸上の位置に最も近いminPriorityQueue内のすべてのイベントを保持しています。
あなたのコンパレータで 'int'にキャストしても、あなたが望むことはできません。 – user2357112