Сортировка Hashmap с объектом в качестве ключа и целым числом в качестве значения - PullRequest
0 голосов
/ 07 июня 2019

У меня есть Hashmap, который содержит объект Customer в качестве ключа и целое число продуктов в качестве значения.

Я хочу получить объект клиента с наименьшим количеством продуктов из этой хэш-карты.

Я попробовал 2 способа, используя поток, но всегда кажется, что я получаю случайный объект, а не объект с наименьшим значением int.

Кто-нибудь может помочь?

Map<Customer, Integer> customerMap = new HashMap<>();

    for (Customer customer:customers) {
        customerMap.put(customer, customer.getProducts().size());
    }

customerMap.entrySet().stream()
  .sorted(Map.Entry.comparingByValue(Comparator.naturalOrder()))
  .findFirst().get().getKey()

customerMap.entrySet().stream()
  .min(Map.Entry.comparingByValue(Integer::compareTo))
  .get().getKey()

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вам не нужно сортировать свою коллекцию, если вы просто хотите найти ключ с наименьшим значением.

Если вы уверены, что у вас будет только один ключ с наименьшим значением (возможно,быть более), то вы можете сделать это:

Customer customerWithSmallestValue = map.entrySet().stream()
                                        .min(Comparator.comparingInt(Map.Entry::getValue))
                                        .map(Map.Entry::getKey)
                                        .get();

или, альтернативно,

Customer customerWithSmallestValue = map.entrySet().stream()
                                        .min(Map.Entry.comparingByValue(Integer::compareTo))
                                        .map(Map.Entry::getKey)
                                        .get();

Обратите внимание, что эти два варианта предоставят вам последний найденный результат на случай, если на карте более одного ключа с наименьшим значением.

0 голосов
/ 07 июня 2019

Я не вижу вашей проблемы, когда я проверяю ваш код, он возвращает правильный Customer с обоими потоками

2 других способа получить результат без использования Map:

1 - сортировка списка клиентов по размеру списка products и выбор первого: (как указала Майя)

customers.sort(Comparator.comparing(cu -> cu.getProducts().size()));
Customer c = customers.get(0);

2 - Использование классического цикла for:

Customer c = customers.get(0);
for(Customer cu : customers) {
    if(cu.getProducts().size() < c.getProducts().size())
        c = cu;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...