2017-03-19 1 views
0

맨하탄 거리에 따라 (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의 모든 이벤트를 보유하고 있습니다.

+2

비교기에서 'int'로 변환하면 원하는대로 처리되지 않습니다. – user2357112

답변

0

여기서 주목할 점은 캐스트를 int로 변경하는 것입니다. 예를 들어이 델타가 1보다 작 으면 0이됩니다. 즉, 같음을 의미합니다. 이는 사실이 아닙니다. 그리고 나는 전체 그림을 이해하지 못합니다. pqTemp에서 어떻게 Comparator를 사용합니까? Comparable 이벤트가있을 수 있습니까?

+0

나는 거기에 다른 비교기를 게시했습니다 – SirWinning

+0

int로 캐스팅하는 대신 1,0 및 -1을 반환해야합니까? – SirWinning

관련 문제