맨하탄 거리에 따라 (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은 - 엿봄은 x 축에 들여다가 최대 맨하탄 거리와 이벤트입니다
manDistanceFarthest --holds 현재 가장 가까운 이벤트 위치에 가장 가까운 minPriorityQueue의 모든 이벤트를 보유하고 있습니다.
비교기에서 'int'로 변환하면 원하는대로 처리되지 않습니다. – user2357112