我正在努力实现以下目标
for (MyObject myObject: myObjects) {
Map<String,String> newMap = new Hashmap<String,String>();
for (Map.Entry<String, String> entry : myObject.getMyMap.entrySet() {
newMap.put(entry.key + "a" , entry.value)
}
}
我希望能够做到以下
settings.json
如何避免这种嵌套循环?
答案 0 :(得分:3)
newMap
在循环之外的声明,否则你在循环的每次迭代中创建一个新的地图,并且不包含你期望的结果。Hashmap
更改为
HashMap
。至于避免嵌套循环,您可以创建entrySet
的流实例,然后使用collect
简单地对流执行缩减操作。
Map<String, String> copy = myObject.getMyMap.entrySet()
.stream()
.collect(Collectors.toMap(p -> p.getKey() + "a", Map.Entry::getValue));
如果要将指定地图中的所有映射复制到另一个地图,然后在评论中建议svasa
,您可以执行以下操作:
newMap.putAll(myObject.getMyMap.entrySet().stream().collect(Collectors.toMap(p -> p.getKey() + "a", Map.Entry::getValue)));
答案 1 :(得分:0)
使用putAll
:
Amap.putAll(Bmap);
答案 2 :(得分:0)
复杂性始终为O(n x m)
,其中n
是列表的大小,m
是内部地图的最大大小。
使用java 8,您可以使用:
Map<String, String> result = myObjects.stream()
.flatMap(myObject -> myObject.getMyMap().entrySet().stream())
.collect(Collectors.toMap(e -> e.getKey() + "a", Entry::getValue));
这假设您只需要一张包含所有内部地图的所有条目的地图,并修改其键。
我使用flatMap
将内部地图的条目展平为一个流,将所有流展平。然后,我使用Collectors.toMap
将所有这些条目收集到一个新地图中。
如果有重复的键,则会失败。在这种情况下,您可以使用overloaded version of Collectors.toMap
,它接受函数在键之间发生冲突时合并值:
Map<String, String> result = myObjects.stream()
.flatMap(myObject -> myObject.getMyMap().entrySet().stream())
.collect(Collectors.toMap(e -> e.getKey() + "a", Entry::getValue, String::concat));
这简单地将多次映射的值连接到同一个键,但您可以使用任何其他合并函数。