自定义比较器:需要解释

时间:2016-02-20 16:52:19

标签: java sorting comparator comparable

有人可以解释一下比较器是如何工作的吗?我的意思是当有人使用返回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?请解释一下。

1 个答案:

答案 0 :(得分:0)

使用a-bInteger.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;
        }
    }
    ...
}