Используя Hashmap в Java, можно ли распечатать количество ключей одинакового значения? - PullRequest
0 голосов
/ 27 февраля 2019

Если у меня есть Hashmap с одинаковыми значениями, но разными ключами, можно ли получить эти ключи с одинаковыми значениями и распечатать количество ключей, разделяющих это значение, и само значение, которое используется совместно, и сделать это динамическитак без жесткого кодирования значений в операторе if?Например,

КОД

HashMap<String, String> map = new HashMap<>();

map.put("Order1"  " pending " );
map.put("Order2"  " cancelled " );
map.put("Order3"  " pending " );
map.put("Order4"  " fulfilled " );

Желаемый вывод

pending 2
cancelled 1
fulfilled 1

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Нет, HashMap не предоставляет эту возможность "из коробки".

Однако вы можете использовать два разных подхода для достижения цели:

A) Если числозаказы в каждом состоянии не нужно проверять так часто, просто итерируйте по map.values() и подсчитывайте количество заказов в каждом состоянии

B) Если количество заказов очень велико или требуется состояниеПроверяется часто, каждый раз, когда вы добавляете новый заказ или обновляете его состояние, увеличиваете счетчик для нового состояния и уменьшаете счетчик для старого состояния.

0 голосов
/ 27 февраля 2019

Другой вариант - сопоставить каждое значение с числом.Вот один из способов сделать это с помощью потоков:

public static <K, V> Map<V, Long> foo(Map<K, V> map) {
    return map.entrySet().stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.counting()));
}

Затем вы можете распечатать результаты примерно так:

Map<String, String> map = ...;
foo(map).forEach((k, v) -> System.out.printf("%s %d%n", k, v));

Вы также можете изменить его, чтобы знать какие ключи были сопоставлены с тем же значением.

public static <K, V> Map<V, List<K>> foo(Map<K, V> map) {
    return map.entrySet().stream().collect(Collectors.groupingBy(
            Map.Entry::getValue,
            Collectors.mapping(Map.Entry::getKey, Collectors.toList())
    ));
}
0 голосов
/ 27 февраля 2019

Вы можете поместить свои значения в Set для получения уникальных значений, а затем подсчитать вхождения каждого элемента с помощью Collections.frequency:

Set<String> singles = new HashSet<>(map.values());

for(String element : singles) {
    System.out.println(element + ": " + Collections.frequency(map.values(), element));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...