2016-02-20 68 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「。在這種情況下,溢出是不可能的。 –