2016-02-20 71 views
0

有人能解释比较器是如何工作的吗?我的意思是,当有人使用返回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

没有人能知道这一点。这些变量名是可怕的 - 什么是'x'?什么是“身高”?什么是'左'?如何比较边缘?是什么让一个边缘“更大”?更长的边缘? “左”与它有什么关系? –

+0

你知道'比较器'用于什么吗?而'compare()'方法应该返回什么? - https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – Codebender

回答

0

使用a-b是快捷方式Integer.compare(a, b)因为在没有溢出的它返回一个正数时a > b,零时a == b,和一个负数,否则。 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; 
     } 
    } 
    ... 
} 
+0

从他发布的链接中,“确保0≤Li,Ri≤INT_MAX,0 0“。在这种情况下,溢出是不可能的。 –