2016-03-15 2 views
1

Я довольно новичок в java, поэтому вопрос. Моя задача - создать класс Checker, который использует сортировщик для сортировки игроков. Логика сортировки состоит в том, чтобы сортировать игроков в порядке убывания по счету, а затем, если у двух игроков одинаковый балл, тот, чье имя лексикографически больше, должен появиться первым.Использование Java Comparator

Это класс игрока

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(); 

Если вам нужно обернуть его в другой класс, то вы можете объявить этот Comparator как private 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: ')' Ожидается .comparingInt (Player :: score) .thenComparing (Player :: name); ^ Решение.java:6: ошибка: незаконное начало типа .comparingInt (Player :: score). ThenComparing (Player :: name); ^ Решение.java:6: error: ';' ожидаемый .comparingInt (Player :: score). thenComparing (Player :: name); ' – Zeus

Смежные вопросы