java - 构建多重映射的正确方法

标签 java dictionary multimap

我已经解决了一个问题,但我正在寻找更好的解决方案。

我有一个很大的实体列表(假设有 500 000 个)

class Entity {
   String key1;
   String key2;
   String value1;
   String value2;
}

我想将其映射到多重映射 Map<String, Map<String, List<Entity>>>基于key1和key2的方式,顶级 map 有entity.key1作为键,以及内部映射 - entity.key2 .

因此我构建了一个映射器类来执行此类操作

class EntityMapper {
   Map<String, Map<String, List<Entity>>> mapByKey1AndKey2(List<Entity> entities) {
        Map<String, Map<String, List<Entity>>> accountMap = new HashMap<>();
        entities.forEach(
            entity -> key1Map.merge(entity.key1, newKey2Map(entity), this::mergeKey2Maps)
        );
        return key1Map;
    }

   Map<String, List<Entity>> newKey2Map(Entity entity) {
        Map<String, List<Entity>> key2Map = new HashMap<>();
        key2Map.put(entity.key2, new ArrayList<>(singletonList(entity)));
        return key2Map;
    }

   Map<String, List<Delta>> mergeKey2Maps(Map<String, List<Entity>> oldMap, Map<String, List<Entity>> newMap) {
        for (String key2 : newMap.keySet()) {
            oldMap.merge(key2, newMap.get(key2), this::mergeLists);
        }
        return oldMap;
    }

   List<Entity> mergeLists(List<Entity> oldList, List<Entity> newList) {
        oldList.addAll(newList);
        return oldList;
    }
}

这种方法有什么缺点吗?或者有什么办法可以优化吗?

免责声明:我知道复合键映射的存在,但它不能满足我的目的。

最佳答案

我认为这应该有效:

Map<String, Map<String, List<Entity>> groupedEntities = 
    entities.stream()
            .collect(Collectors.groupingBy(e -> e.key1,
                     Collectors.groupingBy(e -> e.key2)));

我首先按 key1 对列表进行分组,然后按 key2 对生成的 Map 的值进行分组。

关于java - 构建多重映射的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853894/

相关文章:

ios - 解析来自服务器的复杂嵌套数据

dictionary - Plotly Express 或 Go - map 县内的标签

c# - C# 字典的原子 AddOrUpdate

c++ 为什么 std::multimap 比 std::priority_queue 慢

java - 原子变量上的 vola 关键字

java - SQL从GROUP BY hibernate中删除算术

java - 正则表达式在组内捕获

java - 带有对象的ArrayList,查找重复的对象字段

data-structures - 如何在 Rust HashMap 中为同一个键存储多个元素?

c++ - 访问多映射 C++ 中的元素