2017-02-08 658 views
2

我正在通過一些面試問題來解決這個問題。我徹底明白,除了下一行做什麼代碼:使用lambda表達式以降序對二維數組進行排序

Arrays.sort(pair, (a, b) -> (b[0] - a[0])); 

ň運動員的考慮分數,找到自己的相對排名和人民前三名得分最高,誰就會獲得勳章:「金獎」 ,「銀牌」和「銅牌」

實施例1:輸入:[5,4,3,2,1]輸出:[ 「金牌」, 「銀 獎章」, 「銅牌」, 「4」, 「5」]解釋:前三名運動員獲得前三名,獲得「金牌」, 「銀牌」和「銅牌」。對於左邊的兩名運動員,你只需要根據他們的分數輸出他們的相對排名。

public class Solution { 

    public String[] findRelativeRanks(int[] nums) { 

     int[][] pair = new int[nums.length][2]; 

     for (int i = 0; i < nums.length; i++) { 
      pair[i][0] = nums[i]; 
      pair[i][1] = i; 
     } 

     Arrays.sort(pair, (a, b) -> (b[0] - a[0])); 

     String[] result = new String[nums.length]; 

     for (int i = 0; i < nums.length; i++) { 
      if (i == 0) { 
       result[pair[i][1]] = "Gold Medal"; 
      } 
      else if (i == 1) { 
       result[pair[i][1]] = "Silver Medal"; 
      } 
      else if (i == 2) { 
       result[pair[i][1]] = "Bronze Medal"; 
      } 
      else { 
       result[pair[i][1]] = (i + 1) + ""; 
      } 
     } 

     return result; 
    } 
} 

回答

1

這是調用Arrays.sort方法使用陣列pair排序一個Comparator與lambda表達式定義。只要類型推理能夠發現我們需要一個只需要定義一個函數的類的對象,就可以使用lambda表達式。

有關語法的更多信息,請參閱http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#section2

這個函數將在數組中被調用多次,並且會根據比較函數從「最小」到「最大」進行排序。如果函數返回負數,那麼a將被認爲是「大於」b,如果它返回一個正數,那麼a是「小於」b,並且如果0那麼它就是平局。

這裏的訣竅是比較函數返回b[0] - a[0],這是與平常相反的方向。因此,它將按照最大到最小排序。當然,最大的是金牌得主。隨後是銀色,然後是青銅色。

+0

Java如何知道他們正在比較第一列而不是第二列,以及第二列如何「跟隨」第一列的順序。另外,a和b的含義是什麼,是迭代中的下一個項目?感謝您的回答 –

+0

@RodrigoProença該函數接受數組中的2個元素。你的lambda表達式從'(a,b) - > ...'開始的事實''把它們命名爲'a'和'b'。數組中內容的結構取決於你如何構建它。 – btilly