在Java中使用Hashmap是否可以打印出数量相同的键?

时间:2019-02-27 01:34:49

标签: java printing 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 :(得分:2)

您可以将值放入[Short description]中以获得唯一性,然后使用Set计算每个元素的出现次数:

Collections.frequency

答案 1 :(得分:2)

否,HashMap不能立即提供此功能。

但是,您可以使用两种不同的方法来实现目标:

A)如果不需要经常检查每个州的订单数量,只需遍历map.values()并计算每个州的订单数量

B)如果订单数量很大,或者需要经常检查状态,则每次添加新订单或更新其状态时,为新状态增加一个计数器,为旧状态减少一个计数器。

答案 2 :(得分:1)

另一个选择是将每个值映射到一个数字。这是使用流执行此操作的一种方法:

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