首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用相同的递归函数遍历Map<String、String>和Map<String、Map<String、String>>?

如何使用相同的递归函数遍历Map<String、String>和Map<String、Map<String、String>>?
EN

Stack Overflow用户
提问于 2017-07-31 17:06:45
回答 2查看 977关注 0票数 2

例如,为了使用相同的函数迭代List< String>和List< List< String>>,我可以编写如下代码:

代码语言:javascript
复制
import java.util.*;
public class Test{
    public static void print(Object obj) {
        if(obj instanceof List){
            List list=(List)obj;
            System.out.print("[");
            for(Object obj2 : list){
                print(obj2);
            }
            System.out.print("]");
        }else{
            System.out.print(obj+",");
        }
    }

    public static void main(String[] args){
        String l0="a";
        System.out.println(l0);

        List<String> l1=Arrays.asList("a","b");
        print(l1);

        System.out.println("");

        List<List<String> > l2=Arrays.asList(Arrays.asList("a","b"),Arrays.asList("c","d"));
        print(l2);
    }
}

输出:

代码语言:javascript
复制
a
[a b ]
[[a b ][c d ]]

现在我想迭代Map<字符串,String>和Map<字符串,Map<字符串,String>>,类似地,我尝试了:

代码语言:javascript
复制
import java.util.*;
public class Test{
    public static void print(Object obj) {
        if(obj instanceof Map){
            System.out.print("{");
            Map map=(Map)obj;
            for(Map.Entry<Object,Object> entry : map.entrySet()){
                print(entry.getKey());
                System.out.print(":");
                print(entry.getValue());
                System.out.print(",");
            }
            System.out.print("}");
        }else{
            System.out.print(obj);
        }
    }
    public static void main(String[] args){
        String m0="a";
        print(m0);

        System.out.println("");

        Map<String,String> m1=new HashMap<String,String>();
        m1.put("surname","Tom");
        m1.put("lastname","Bob");
        print(m1);

        System.out.println("");

        Map<String,HashMap<String,String>> m2=new HashMap<String,HashMap<String,String>>();
        HashMap<String,String> mm1=new HashMap<String,String>();
        mm1.put("surname","Tom");
        mm1.put("lastname","Bob");
        mm1.put("nickname","Penguin");
        m2.put("owner",mm1);
        HashMap<String,String> mm2=new HashMap<String,String>();
        mm2.put("name","Lucky");
        mm2.put("type","cat");
        m2.put("pet",mm2);
        print(m2);
    }
}

其预期输出类似于:

代码语言:javascript
复制
a
{surname:Tom,lastname:Bob,}
{owner:{surname:Tom,nickname:Penguin,lastname:Bob,},pet:{name:Lucky,type:cat,},}

但是它不能编译:

代码语言:javascript
复制
Test.java:20: error: incompatible types: Object cannot be converted to Entry<Object,Object>
        for(Map.Entry<Object,Object> entry : map.entrySet()){

原因何在?有没有可能修复它?如果没有,我如何递归地迭代嵌套的map,就像前面所示的递归迭代列表一样?

EN

回答 2

Stack Overflow用户

发布于 2017-07-31 17:09:53

MapMap<Object,Object>不同。

它要么转换为Map<Object,Object>,要么使用不带泛型的Entry

票数 0
EN

Stack Overflow用户

发布于 2017-07-31 17:24:52

这里:

代码语言:javascript
复制
public static void print(Object obj) {
    if(obj instanceof Map){
        System.out.print("{");
        Map map=(Map)obj; // <-- raw map
   ....

声明一个原始的Map

它具有重要的后果,因为编译器将绑定已声明对象的方法,而不考虑泛型。

下面是在Map接口中声明的entrySet()方法:

代码语言:javascript
复制
Set<Map.Entry<K, V>> entrySet();

这个方法看起来像这样:

代码语言:javascript
复制
Set entrySet();

所以这段代码不能编译:

代码语言:javascript
复制
for (Map.Entry<Object, Object> entry : map.entrySet()) {

因为你操纵了一个原始的Set

要解决您的问题,您可以将Map转换为Map<Object,Object>或更好的Map<?, ?>

代码语言:javascript
复制
Map<?, ?> map = (Map<?, ?>) obj;
for (Map.Entry<?, ?> entry : map.entrySet()) {
    print(entry.getKey());
    System.out.print(":");
    print(entry.getValue());
    System.out.print(",");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45411631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档