2017-07-31 152 views
1

例如,以列表遍历字符串<>和List <名单<字符串>>使用相同的功能,我可以写这样的事:如何使用相同的递归函数迭代Map <String,String>和Map <String,Map <String,String >>?

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 ]] 

现在我想遍历地图< String,String>和Map < String,Map < String,String >>同样,我试过了:

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一样?

+0

为什么定义一个'Object',而不是打印了'Map'参数()? – davidxxx

+0

你可以试试:Map map =(Map)obj;'? – Tr1gZer0

回答

0

A MapMap<Object,Object>不一样。

它会转换为Map<Object,Object>或使用Entry没有泛型。

0

这里:

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

解决你的问题,你可以施放MapMap<Object,Object>或更好Map<?, ?>

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