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.compare
或Integer.compare
0对它们进行比较。
如果您确实期望(或希望避免(溢出,请确保使用双重算术:
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)
是的,您使用的是double
s.
dis
返回一个双精度。你正试图用Integer.compare
来比较两个替身。因此,Java正在为您将doubles转换回int,从而导致错误消息。