от
    На этот вопрос уже есть ответ здесь:                           Как заставить max () возвращать ВСЕ максимальные значения в потоке Java?                                      5 ответов                                     Я почти закончил заканчивать свой покерный проект для университета, но я все еще немного борюсь с потоками Java. Я написал класс HandEvaluator, который вычисляет силу каждой руки игрока и назначает ее игроку. Теперь я пытаюсь добавить игрока или игроков (если более одного игрока имеют одинаковый счет / разделенный банк) с наибольшим количеством очков в списке для подсчета выигрышей. У меня проблемы с синтаксисом потоков. Я пытаюсь что-то вроде этого:
playerList.stream().max(Comparator.comparing(Player::getHandScore)).get();
Это возвращает Игрока с наибольшим количеством очков, но что, если есть несколько с одинаковым количеством очков? И как мне добавить их в список?              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

5 Ответы

0 голосов
от
Я сделал что-то вроде этого. Я группирую по счету, а затем нахожу счет с максимальным значением ключа. Он вернет
Optional
Map.Entry
. Он содержит как максимальное значение, так и игроков, которые его имеют. Тогда я могу получить список игроков, используя метод
getValue()
.
List
0 голосов
от
Одно простое для понимания решение заключается в следующем:
int maxHighScore = playerList.stream()
                             .map(player 

На первом этапе мы получаем maxHighScore, а на втором этапе мы фильтруем игроков, чтобы оставить только тех, кто набрал максимальное количество очков.
    
0 голосов
от
    int max = playerList.stream()
            .max(Comparator.comparing(Player::getHandScore))
            .get()
            .getHandScore();

    List
0 голосов
от
Моим ответом будет версия ответа MC Emperor с
SortedMap
, но эта версия отбросит «более низкие» группы, как только найдет одного игрока, чей счет выше. Эта версия предназначена для случаев, когда действительно много элементов, и сохранение всех видимых элементов может стать проблемой. Например, когда потоковые элементы читаются из действительно большого файла, это не помещается в память. Решение в целом будет выглядеть так:
List
0 голосов
от
Проблема, с которой я столкнулся с некоторыми другими ответами, заключается в том, что они дважды просматривают список игроков - один для группировки по количеству игроков, а другой - для получения игроков с наибольшим количеством очков. Это может быть тривиально в обычных случаях, но может быть проблемой, когда список игроков больше. Чтобы избежать двойного обхода списка, нужно использовать
SortedMap
. После того, как мы сгруппировали игроков по их количеству, мы можем просто вызвать
lastKey()
, чтобы сразу получить самый высокий ключ:
SortedMap
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...