【问题标题】:How to iterate over Map<String,String> and Map<String,Map<String,String>> using the same recursion function?如何使用相同的递归函数迭代 Map<String,String> 和 Map<String,Map<String,String>>?
【发布时间】:2018-01-06 18:35:26
【问题描述】:

例如,为了使用相同的函数迭代 List 和 List>,我可以这样写:

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);
    }
}

输出:

a
[a b ]
[[a b ][c d ]]

现在我想迭代 Map 和 Map> 类似,我试过了:

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);
    }
}

预期的输出是这样的:

a
{surname:Tom,lastname:Bob,}
{owner:{surname:Tom,nickname:Penguin,lastname:Bob,},pet:{name:Lucky,type:cat,},}

但它无法编译:

Test.java:20: error: incompatible types: Object cannot be converted to Entry<Object,Object>
        for(Map.Entry<Object,Object> entry : map.entrySet()){

是什么原因?有可能修复它吗?如果没有,我怎样才能递归地迭代嵌套映射,就像在显示的开头递归地迭代 List 一样?

【问题讨论】:

  • 为什么在 print() 中定义 Object 而不是 Map 参数?
  • 你可以试试:Map&lt;Object,Object&gt; map=(Map)obj;

标签: java list dictionary recursion compiler-errors


【解决方案1】:

MapMap&lt;Object,Object&gt; 不同。

它要么转换为Map&lt;Object,Object&gt;,要么使用不带泛型的Entry

【讨论】:

    【解决方案2】:

    这里:

    public static void print(Object obj) {
        if(obj instanceof Map){
            System.out.print("{");
            Map map=(Map)obj; // <-- raw map
       ....
    

    你声明了一个原始的Map
    它具有重要的后果,因为编译器将绑定声明对象的方法而不考虑泛型。

    这是Map接口中声明的entrySet()方法:

    Set<Map.Entry<K, V>> entrySet();
    

    这个方法看起来像:

    Set entrySet();
    

    所以这段代码无法编译:

    for (Map.Entry<Object, Object> entry : map.entrySet()) {
    

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

    要解决您的问题,您可以将Map 转换为Map&lt;Object,Object&gt; 或更好的Map&lt;?, ?&gt;

    Map<?, ?> map = (Map<?, ?>) obj;
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        print(entry.getKey());
        System.out.print(":");
        print(entry.getValue());
        System.out.print(",");
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多