PriorityQueue(Java),用Long覆盖比较器

时间:2018-09-08 22:07:48

标签: java

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可能溢出。但是编译器说我的代码有问题。我不知道为什么有人帮我吧。

1 个答案:

答案 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);