将具有列表的嵌套HashMap转换为具有linkedHashMap而非列表的另一个嵌套HashMap



我在java中有一个映射,它是以下内容的实例:

Map< K1,Map< K2, List<Object>>>

我想将其转换为以下结构:

Map< K1, Map< K2, LinkedHashMap<Object, Value>>> 

其中Value是Object的属性。我还想将列表中的顺序保留到HashMap。

我发现了一些类似的代码示例,说明我正在努力实现的目标,但并不相同。我很感激能得到的任何帮助。

请尝试一下。假设第一映射是foo,并且第二映射(具有LinkedHashMap(是bar

bar = new HashMap<>();
for (var key1 : foo.keySet()) {
bar.put(key1, new HashMap<>()); // key1 is of type K1
var innerMap = foo.get(key1); // type: Map< K2, List<Object>>
for (var key2 : innerMap.keySet()) { // key2 is of type K2
bar.get(key1).put(key2, new LinkedHashMap<>());
var innerLinkedMap = bar.get(key1).get(key2); // type: LinkedHashMap<Object, Value>; now empty
for (var element : innerMap.get(key2)) {
innerLinkedMap.put(element, element.something); // insert in the order of the list
}
}
}

请注意,只有当每个列表中的元素都是唯一的时,它才有效,否则相同的键将被重新插入LinkedHashMap,这不会影响插入顺序。

我可能在上面的实现中犯了一些愚蠢的错误,请在这种情况下进行评论和编辑。

可以使用流完成

map.entrySet().stream().collect(toMap(
Map.Entry::getKey, // K1
//transforming inner map
e -> e.getValue().entrySet().stream().collect(toMap( 
Map.Entry::getKey, // K2
// iterating list and transforming it into linkedhashmap
es -> es.getValue().stream().collect( 
toMap(identity(),
Obj::getValue,
(a, b) -> b,
LinkedHashMap::new)
)
))
));

最新更新