PriorityQueue<Point> pq = new PriorityQueue(10, new Comparator<Point>(){
public long compare(Point a, Point b) {
long disA = (a.x - origin.x) * (a.x - origin.x) + (a.y - origin.y) * (a.y - origin.y);
long disB = (b.x - origin.x) * (b.x - origin.x) + (b.y - origin.y) * (b.y - origin.y);
if (disA == disB) {
return (long)(a.x - b.x);
}
else {
return disA - disB;
}
}
});
我正在使用PriorityQueue并覆盖Comparator,但是我需要使用Long而不是int。因为disA和disB可能溢出。但是编译器说我的代码有问题。我不知道为什么有人帮我吧。
答案 0 :(得分:6)
Comparator.compare
方法必须返回int
。这就是界面定义方法的方式:
public int compare(Point a, Point b) {
我假设您认为您必须返回long
,因为相减会产生long
类型的表达式。一方面,不要使用减法,以防溢出。
相反,请使用Long.compare
,它返回int
:
return Long.compare(b.x, a.x);
return Long.compare(disB, disA);