Как отсортировать список по номеру, а при дублировании отсортировать по строке? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть игроки с именами (String name) по именам, и у меня есть любовники (int Lovers).

У каждого игрока есть несколько любовников. и у каждого игрока есть уникальное имя. Я хочу отсортировать их по номеру, и если у двух или более игроков одинаковое количество любовников, я хочу, чтобы они сортировались в алфавитном порядке.

Я думал об использовании Map и Hashmap.

        Map<String, Integer> Players= new HashMap<>();
        Players.put("Christiano Ronaldo",10);
        Players.put("Messi",50);
        Players.put("Kaka",10);
        Players.put("Ronaldinho",100);

        List sortedKeys=new ArrayList(Players.keySet());
        Collections.sort(sortedKeys);

Я считаю, что этот способ не является оптимальным для моего случая.

Я ожидаю, что сортируется по количеству любовников, и если число любовников равно, то мы сортируем ихпо названию в алфавитном порядке.

1 Ответ

0 голосов
/ 05 ноября 2019

Используя java 8 Collections, это может выглядеть так, но вы можете создать класс так, как было предложено, я просто набросал его как интерфейс. Без Comparator эта вложенная сортировка может стать довольно неприятной.

interface Player{
    Integer getLovers();
    public String getName();
}

List<Player> sorted = players.entrySet()
            .stream()
            .map(i -> new Player(i.getKey(), i.getValue()))
            .sorted(Comparator.comparing(Player::getLovers).thenComparing(Player::getName))
            .collect(Collectors.toList());

Если вы хотите иметь только список имен, вы можете отобразить его:

List<String> names = sorted.stream()
            .map(Player::getName)
            .collect(Collectors.toList());

Вы также можетевозьмите прямой подход @ Deadpool, но избегайте создания другой промежуточной карты. На данный момент посредник может просто делать то, что вы хотите, но нет гарантии для его порядка итерации. На данный момент он фактически создает LinkedHashMap, который сохраняет порядок, но это не гарантирует, что он останется таким же навсегда, если реализация потоковой передачи изменится.

List<String> names = players.entrySet().stream()
            .sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)
                    .thenComparing(Map.Entry<String, Integer>::getKey))
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...