构建多图的正确方法
Proper way of constructing a 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来做这样的事情
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
的值进行分组。
我有一个问题已解决,但我正在寻找更好的解决方案。
我有一长串(假设有 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来做这样的事情
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
的值进行分组。