我正在实施一个应用程序,它根据曼哈顿距离找到(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()));
}
答案 0 :(得分:0)
我在这里看到的唯一问题是你的演员到int。作为一个例子,如果这个delta小于1 - 你将得到0 - 这意味着等于 - 这不是真的。 我不明白整个画面。你如何在pqTemp中使用你的比较器?可能你有可比事件吗?