构造多图的正确方法

时间:2018-10-17 11:33:18

标签: java dictionary multimap

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

我有很多(假设有500 000个)实体

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

我想将其映射为基于key1和key2的多重映射Map<String, Map<String, List<Entity>>>,顶级映射将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;
    }
}

这种方法是否有缺点?还是有什么方法可以对其进行优化?

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

1 个答案:

答案 0 :(得分:1)

我认为这应该可行:

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

我首先将列表按key1分组,然后将结果Map的值按key2分组。