Java优先级队列表现得很奇怪

时间:2017-03-19 23:19:17

标签: java priority-queue

我正在实施一个应用程序,它根据曼哈顿距离找到(x,y)平面中给定位置最近的n个事件。 我使用最大PriorityQueue存储找到的事件,与曼哈顿距离比较器。这个队列应该总是有max manDistance事件,但我发现这不会一直发生。 我在循环中使用pq.poll()打印了这个队列的结果,我发现删除后队列没有重新排列,只是有时候。

我的比较器:

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轴上最接近事件的事件。然后我将它添加到包含最接近事件的maxPriorityQueue,如果它的大小小于5,或者偷看manDistance高于事件相比。如果我从我的maxPriorityQueue到达一个x高于偷看事件的manDistance的事件,那么我找到了我最接近的5个事件。

pqTemp - 将所有事件保存在minPriorityQueue中,其中peek最接近x轴上的位置

manDistanceFarthest - 保留当前最近的事件,其中peek是具有最大曼哈顿距离的事件。

public void findClosestEvents(){
    int steps=1;
    PriorityQueue<Event> pqTemp=new PriorityQueue<>(xClosest);
    manDistFarthest.add(pqTemp.poll());
    while (!(pqTemp.isEmpty())){
        steps+=1;
        if (manDistFarthest.size()<5)
            manDistFarthest.add(pqTemp.poll());

        else if (Math.abs(pqTemp.peek().getxCord())>manDistFarthest.peek().calcManDistance(xLoc, yLoc))
            break;
        else
            if (pqTemp.peek().calcManDistance(xLoc, yLoc)<=manDistFarthest.peek().calcManDistance(xLoc, yLoc)){
                manDistFarthest.poll(); 
            manDistFarthest.add(pqTemp.poll());
        }
            else pqTemp.poll();
    }
    System.out.println(MessageFormat.format("Checked {0} events out of {1}.",steps,xClosest.size()));

}

1 个答案:

答案 0 :(得分:0)

我在这里看到的唯一问题是你的演员到int。作为一个例子,如果这个delta小于1 - 你将得到0 - 这意味着等于 - 这不是真的。 我不明白整个画面。你如何在pqTemp中使用你的比较器?可能你有可比事件吗?