对于您所问的问题,计算距离有一个问题:
Point # 0 = (0, 0)
Point # 1 = (Double.MIN_VALUE, Double.MAX_VALUE) -> (4.9E-324, 1.7E308)
Point # 2 = (Double.MIN_VALUE, Double.MIN_VALUE) -> (4.9E-324, 4.9E-324)
Point # 3 = (Double.MAX_VALUE, Double.MAX_VALUE) -> (1.7E308, 1.7E308)
注:
Double.MIN_VALUE
是正数。
现在是欧几里得距离
d = Math.sqrt(((a.x - b.x) * (a.x - b.x)) + ((a.y - b.y) * (a.y - b.y)));
回来
Infinity
计算之间的距离时
Point # 0
和
Point # 1
,及
点#0
和
Point # 3
因为:
第1点
(a.x - b.x) * (a.x - b.x) = (1.7E308 - 0) * (1.7E308 - 0) = 1.7E308 * 1.7E308 = Infinity
Math.sqrt(Infinity + Infinity) = Infinity;
得到距离
第1点
和
点#0
(
无穷
),然后将其与
第3点
和
点#0
(也
无穷
)然后
Infinity = Infinity
是
true
因此
Comparator
表示“两个点相等”,并且
PriorityQueue
不要随意点菜。
用于与
Double.MAX_VALUE
你不能使用
Double
,而不是使用
BigDecimal
:
private BigDecimal getDistance(Point a, Point b) {
BigDecimal dx = BigDecimal.valueOf(a.x - b.x);
BigDecimal dy = BigDecimal.valueOf(a.y - b.y);
BigDecimal distance = dx.pow(2).add(dy.pow(2));
return distance;
}
为什么我们不使用平方根计算实际距离?因为:
-
BigDecimal类没有这样的方法(如果您
here
你可以)。
-
因为如果
a > b
然后
sqrt(a) > sqrt(b)
,它是成比例的,所以不应用平方根函数就可以得到这个值。
利用
大十进制
,它实现了自己的
比较器
所以我们在
compareTo
方法
比较器
定义:
@Override
public int compare(Point o1, Point o2) {
BigDecimal d1 = getDistance(o1);
BigDecimal d2 = getDistance(o2);
return d1.compareTo(d2);
}