错误:类型不兼容可能是从double到int的有损转换


class Solution {
public int[][] kClosest(int[][] points, int k) {
PriorityQueue<int[]> pq = new PriorityQueue<>((int[] a, int[] b) -> Integer.compare(dis(a),dis(b)));
for(int[] i : points) {
pq.offer(i);
if(pq.size() > k) {
pq.poll();
}
}
int[][] res = new int[k][2];
int c = 0;
for(int[] i : pq) {
res[c] = i;
c++;
}
return res;
}
public double dis(int[] a) {
return a[0]*a[0] + a[1]*a[1];
}
}

错误消息:

Line 3: error: incompatible types: possible lossy conversion from double to int
PriorityQueue<int[]> pq = new PriorityQueue<>((int[] a, int[] b) -> Integer.compare(dis(a),dis(b)));
                         ^                                                                                         

我试图解决一个leetcode问题,但我一直犯这个错误。我甚至没有在代码中的任何位置使用double。

Integer.compare(dis(a),dis(b))

CCD_ 1占用两个CCD_;你正在通过两个double

请改用Double.compare(dis(a), dis(b))


然而,值得指出的是,dis方法可以返回int

public double dis(int[] a) {
return a[0]*a[0] + a[1]*a[1];
}

使用整数运算进行整个计算,然后将结果扩展为double。有效:

public double dis(int[] a) {
int result = a[0]*a[0] + a[1]*a[1];
return (double) result;
}

如果您要转换为double以避免溢出,这也没有帮助:在扩展为double之前,溢出就已经发生了。

如果您不希望溢出,您可以简单地将返回类型更改为int,然后使用Integer.compareInteger.compare0对它们进行比较。

如果您确实期望(或希望避免(溢出,请确保使用双重算术:

public double dis(int[] a) {
return (double) a[0]*a[0] + (double) a[1]*a[1];
}

此外,请注意比较器可以更简洁地表示:

Comparator.comparingDouble((int[] a) -> dis(a))
// or
Comparator.comparingDouble(this::dis)

而不是

(int[] a, int[] b) -> Double.compare(dis(a),dis(b))
public double dis(int[] a)

是的,您使用的是doubles.

函数dis返回一个双精度。你正试图用Integer.compare来比较两个替身。因此,Java正在为您将doubles转换回int,从而导致错误消息。

最新更新