java - 按值对 Java HashMap 键进行分组

标签 java hashmap

假设我有这个 HashMap:

(key: value)
A: 3
B: 4
C: 2
D: 4
E: 1
F: 3

我想把它转换成这个 HashMap:

1: {"E"}
2: {"C"}
3: {"A", "F"}
4: {"B", "D"}

我该怎么做呢?

最佳答案

使用 Java8 流

Map<Integer, List<String>> valueMap = map.keySet().stream().collect(Collectors.groupingBy(k -> map.get(k)));

输出

{1=[E], 2=[C], 3=[A, F], 4=[B, D]}

使用方法引用

Map<Integer, List<String>> valueMap = map.keySet().stream().collect(Collectors.groupingBy(map::get));

获取键的方式是排序

Map<Integer, List<String>> valueMap = map.keySet().stream().collect(Collectors.groupingBy(map::get, TreeMap::new, Collectors.toList()));

Java7及以下版本

    Map<Integer, List<String>> valuesMap = new HashMap<>();
    for (String key : map.keySet()) {
        Integer val = map.get(key);
        if (valuesMap.get(val) == null) {
            List<String> values = new ArrayList<>();
            values.add(key);
            valuesMap.put(val, values);
        } else {
            valuesMap.get(val).add(key);
        }
    }

输出

{1=[E], 2=[C], 3=[A, F], 4=[B, D]}

关于java - 按值对 Java HashMap 键进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40121339/

相关文章:

java ConcurrentMap 获取空值

Java hashmap - 基于两个不同类型对象的键

java - 如何通过整数键 Java 对数组的 HashMap 进行排序

java - Java中三个线程的合并

java - Java中 "instanceof"的使用

java - Spring 启动: how to show actual classpath on startup or at runtime?

java - 如何停止使用 Java 和 Python 客户端在 RabbitMQ 中消费?

java - 如何从另一个类调用HashMap的方法?

javascript - javascript 中整数键的 HashMap

java - <String, String> HashMap 中的整数对象