2017-07-31 153 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(","); 
} 
相關問題