2016-03-15 62 views
1

我對java相當陌生,因此是個問題。我的任務是創建一個類檢查器,它使用比較器desc對玩家進行排序。排序邏輯是按照降序對玩家進行排序,然後如果兩個玩家的得分相同,那麼名稱按字典順序排列的玩家應該首先出現。Java比較器的使用情況

這是球員類

class Player 
{ 
    String name; 
    int score; 
} 

的比較被稱爲這樣

Checker check=new Checker(); 
................. 
Arrays.sort(Player,check.desc); 

這是我試過,

class Checker implements Comparator<Player>{ 

    public int compare(Player p1, Player p2){ 
     if(p1.score < p2.score) return 1; 
     else if(p1.score > p2.score) return -1; 
     else if(p1.score == p2.score){ 
      if(p1.name.compareTo(p2.name) < 0) return 1; 
      else if(p1.name.compareTo(p2.name) > 0) return -1; 
      else if (p1.name.compareTo(p2.name) == 0) return 0; 
     } 
    } 
} 

有人能幫助我得到它的權利。我不太瞭解desc如何成爲checker類的屬性。

+0

「我真的不明白desc如何成爲檢查器類的屬性。」那麼,如果你不添加它就不是。但是,如果您始終希望按特定順序(無論是上升還是下降)進行排序,則不需要添加任何內容 - 只需使該邏輯爲該固定順序返回正確的值即可。 –

+0

我將比較器的名字命名爲desc,然後將其刪除,因爲我無法理解它。 – Zeus

+1

不通過類PLayer,而是傳遞包含玩家的列表 –

回答

1

如果您可以在解決方案中使用Comparator,那麼它實際上比您想象的要簡單得多。

Comparator<Player> playerSorted = Comparator 
    .comparingInt(Player::getScore) 
    .thenComparing(Player::getName) 
    .reversed(); 

如果你需要用它在另一個類,那麼你可以聲明這個Comparatorprivate static final和委託compare方法吧。

class Checker implements Comparator<Player> { 
    private static final Comparator<Player> SORT_ASC = Comparator 
     .comparingInt(Player::getScore).thenComparing(Player::getName); 
    private static final Comparator<Player> SORT_DESC = SORT_ASC.reversed(); 

    private final boolean descending; 

    public int compare(Player player1, Player player2) { 
     Comparator<Player> sorter = descending ? SORT_DESC : SORT_ASC; 
     return sorter.compare(player1, player2); 
    } 
} 
+0

這很優雅,但我受限於我如何在代碼中實現它。我需要實現一個比較器類。 – Zeus

+0

@Zeus我已經添加了關於如何在自己的班級中使用這個功能的評論。 – sprinter

+0

我得到了Player :: score語法的編譯錯誤。不知道這是什麼意思。 'error:')'expected .comparingInt(Player :: score).thenComparing(Player :: name); ^ Solution.java:6:錯誤:非法開始類型 .comparingInt(Player :: score).thenComparing(Player :: name); ^ Solution.java:6:error:';'預計 .comparingInt(Player :: score).thenComparing(Player :: name);' – Zeus