有人可以解释一下比较器是如何工作的吗?我的意思是当有人使用返回a-b或例如从这里(http://buttercola.blogspot.com/2015/08/leetcode-skyline-problem.html)获取时:
public class EdgeComparator implements Comparator<Edge> {
@Override
public int compare(Edge a, Edge b) {
if (a.x != b.x) {
return a.x - b.x;
}
if (a.isLeft && b.isLeft) {
return b.height - a.height;
}
if (!a.isLeft && !b.isLeft) {
return a.height - b.height;
}
return a.isLeft ? -1 : 1;
}
}
比如说,这里为什么他们使用a.height -b.height?或者b.height - a.height?请解释一下。
答案 0 :(得分:0)
使用a-b
是Integer.compare(a, b)
的快捷方式,因为在没有溢出时会在a > b
时返回正数,在a == b
时返回0 ,否则为负数。 b-a
会改变比较的方向,当a
更大而不是b
时返回否定。
但是,当两个数字幅度较大时,减法方法会因溢出而中断,因此应该使用Integer.compare
代替:
public class EdgeComparator implements Comparator<Edge> {
@Override
public int compare(Edge a, Edge b) {
int res = Integer.compare(a.x, b.x);
if (res != 0) {
return res;
}
if (a.isLeft && b.isLeft) {
return Integer.compare(b.height, a.height);
}
if (!a.isLeft && !b.isLeft) {
return Integer.compare(a.height, b.height);
}
return a.isLeft ? -1 : 1;
}
}
...
}