題目描述
為了進行排序,比較器被用來比較兩個物件。這個題目將會測驗您對Java比較器的認知。
在比賽中有N個玩家。您將會得到他們的名稱和分數,接著您需要以反序的方式排序這些玩家分數。如果兩個玩家的分數一樣,那麼玩家名稱之字典排序在前的玩家要排在前面的位置。
原題網址
輸入格式
第一行包含一個整數N,表示玩家的數量。接下來的N行為每個玩家的名稱和分數,用空格字元隔開。
兩個不同的玩家可以用有相同的名稱,玩家的名稱使用小寫英文字母組成。玩家的分數範圍在0到1000之間(包含0和1000)。
輸出格式
排序之後分行輸出每個玩家的名稱和分數,用空格字元隔開。
範例輸入
5
amy 100
david 100
heraldo 50
aakansha 75
aleksa 150
amy 100
david 100
heraldo 50
aakansha 75
aleksa 150
範例輸出
aleksa 150
amy 100
david 100
aakansha 75
heraldo 50
amy 100
david 100
aakansha 75
heraldo 50
解題概念
程式第28行使用了check物件作為排序陣列的Comparator,因此必須撰寫Checker類別,並實作出Comparator介面的compare方法。
compare方法若傳回值小於0,表示第一個傳入的參數在邏輯上小於第二個傳入的參數;若等於0,表示兩個參數邏輯相等;若大於0,表示第一個傳入的參數在邏輯上大於第二個傳入的參數。所以當第一個玩家的分數比第二個玩家的分數大時,要傳回-1;小於時,要傳回0;若等於的話,要再比較名稱的順序。由於名稱是字串,所以可以直接使用字串的compareTo方法來比較辭典排列順序。
參考答案
import java.util.*;
class Player {
String name;
int score;
Player(String name, int score) {
this.name = name;
this.score = score;
}
}
class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
Player player[] = new Player[n];
Checker checker = new Checker();
for (int i = 0; i < n; i++) {
player[i] = new Player(scan.next(), scan.nextInt());
}
scan.close();
Arrays.sort(player, checker);
for (int i = 0; i < player.length; i++) {
System.out.printf("%s %s\n", player[i].name, player[i].score);
}
}
}
class Checker implements Comparator<Player> {
@Override
public int compare(Player a, Player b) {
if (a.score > b.score) {
return -1;
} else if (a.score < b.score) {
return 1;
}
return a.name.compareTo(b.name);
}
}