題目描述

您將會得到學生的資料清單,包含ID、名字和成績平均積點(CGPA)。您的任務是要依據成績平均積點遞減的方式重新排列學生的清單。若兩個學生擁有相同的成績平均積點,使用他們的名字的辭典順序來排列。如果學生的名字也相同,那麼就使用他們的ID來排列。

原題網址

https://www.hackerrank.com/challenges/java-sort

輸入格式

第一行包含一個整數N,表示學生的數量,範圍在2到1000之間(包含2和1000)。接下來的N行為每個學生的ID、名字和成績平均積點,用空格隔開。ID的範圍在0到100000之間(包含0和100000),開頭不為0;名字的長度在5到30之間(包含5和30),使用小寫英文字母組成;成績平均積點在0到4.0之間(包含0和4.0),小數點最多有兩位。

輸出格式

重新排列學生的清單後,依序分行輸出學生的名字。

範例輸入

5
33 Rumpa 3.68
85 Ashis 3.85
56 Samiha 3.75
19 Samara 3.75
22 Fahim 3.76

範例輸出

Ashis
Fahim
Samara
Samiha
Rumpa

解題概念

使用List物件的方法傳入Comparator參數來完成排序,Comparator的實作可以直接使用Lambda表示式來完成。首先判斷兩物件的成績平均積點,若前者大於後者,回傳-1;若前者小於後者,回傳1。如果成績平均積點相同,再來判斷兩物件的名字,由於名字是字串,所以可以直接使用字串物件的compareTo方法來比較其辭典順序,若小於0,回傳-1;若大於0,回傳1。如果辭典順序相等,要再判斷ID的順序,直接回傳前者ID減掉後者ID的結果即可。

參考答案