迭代Map中的Map列表

3

我有一个像这样的map

Map<String, Map<String, List<String>>> m;

我想要遍历一个列表。

我的思路是这样的:

  1. 首先获取第一张地图的键
  2. 然后获取第二张地图的键
  3. 从那个键开始迭代列表。


for (Map m:m.keyset()){

    for (Map m1:m.getKey(){

        List<String> l = m1.getKey(){

        for (String s:l){
        }
    }
}

这个正确吗?

我不确定如何测试它...请帮我...:)


2
我对测试它感到困惑,是什么?也不要忽略泛型。 - SomeJavaGuy
你的List是键还是值? - PM 77-1
1
你试过了吗?这是最快、最简单的方法来判断它是否正常。 - talex
1
重复的问题:如何高效地迭代映射中的每个条目? - Sergei Rybalkin
1
在一个容器中嵌套另一个容器,再嵌套另一个容器,你可能应该学习如何编写类。你的代码难以维护,让人头疼。 - Robert
显示剩余2条评论
3个回答

6
Map<String, Map<String, List<String>>> m = new HashMap<>();

使用Entry迭代Map:

for (Map.Entry<String, Map<String,List<String>> entry : m.entrySet()) {
    for (Map.Entry<String, List<String>> innerEntry : entry.entrySet()) {
        for (String elem : innerEntry) {
            ...
        }
    }
}

关于Java 8:

m.forEach((s, entry) -> entry.forEach(
        (s1, innerEntry) -> innerEntry.forEach(
                elem -> { ... }
        )
));

2
你差不多找到了,这就是你要找的东西。
Map<String,Map<String,List<String>>> m = new HashMap<String, Map<String,List<String>>>();

for(String k : m.keySet()) {
    Map<String,List<String>> m1 = m.get(k);

    for(String k1 : m1.keySet()) {
        List<String> l = m1.get(k1);

        for (String s : l){
        }
    }
}

为什么我们要使用字符串k? - prasad
增强型for循环有三个部分。第三部分是正在迭代的集合。中间部分是表示迭代中当前值/对象的局部变量。第一部分是集合中对象的类型。在您的情况下,m.keySet()返回一个字符串集合。因此,String将是必须放入第一部分的类型。 - user3138997
如果你想知道为什么"for(String k : m.keySet())"正确而"for (Map m:m.keyset())"不正确 - 那么你需要了解增强for循环的一般结构,例如:"for(firstpart secondpart : thirdpart)"。 - user3138997

1

只需迭代值

    Map<String,Map<String,List<String>>> m = new HashMap<String, Map<String,List<String>>>();

    for(Map<String,List<String>> m2 : m.values()) {
        for(List<String> l : m2.values()) {
            for (String s : l){
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接