如何避免嵌套循环

时间:2017-06-01 17:58:00

标签: java data-structures hashmap nested-loops

我正在努力实现以下目标

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

如何避免这种嵌套循环?

3 个答案:

答案 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));

这简单地将多次映射的值连接到同一个键,但您可以使用任何其他合并函数。