2012-08-27 60 views
2

我有一個HashMap<String, Object>,看起來像這樣,當我在調用它的ToString():遍歷嵌套(多維)的HashMap

{somekey=false, anotherKey=someString, thirdKey={nestedKey=hello, nestedKey2=world,etc=etcetcetc}} 

在我的劇本的某一點,我想重複通過設置爲自己的地圖的「thirdKey」。有沒有一種常見的慣例來隔離「嵌套」的HashMap並將其用作其自己的一維地圖?

+1

換句話說,你想「平整」整個地圖的迭代? –

+0

您的數據中可能存在多少層級的嵌套地圖? –

+0

只是2個級別 - 如示例 –

回答

5

這是我的代碼遞歸提取地圖中的所有值(以及這些地圖中的地圖)。

public List<Object> getValues(Map<String, Object> map) { 

    List<Object> retVal = new ArrayList<Object>(); 

    for (Map.Entry<String, Object> entry : map.entrySet()) { 
     Object value = entry.getValue(); 

     if (value instanceof Map) { 
      retVal.addAll(getValues((Map) value)); 
     } else { 
      retVal.add(value); 
     } 
    } 

    return retVal; 
} 

正如Vikdor已經說過的,我認爲這沒有真正的約定。

編輯: 你當然也可以將鍵和值寫入一個新的Map(「展平」它)。我只是將值添加到列表中,因爲這樣當一個嵌套地圖使用已存在的鍵時,您不會遇到問題。

+0

有道理,謝謝 –

1

我懷疑是否會有一個「常見約定」與泛型地方。最好轉向強類型程序,不要將Object用作hashmap的鍵或值。那麼這個場景就不會遇到,而且會有更多有組織的數據定義。我的兩分錢!

2

沒有約定我知道。您必須回退到instanceof以查看密鑰中的值是否爲Map,並且如果它是遞歸處理,則會特別對待它。

+0

我正在寫這個答案,但你已經寫了。好的。我還建議不要認爲它只是兩個級別。設計它可以處理多個層次。 –

+0

@DhruvenkumarShah是的 - 我最近完成了這個模仿javascript/json的工作方式 – Bohemian

0
public static Map<String, Object> flatten(Map<String, Object> map) { 
    Map<String, Object> newMap = new HashMap<>(); 
    for (Entry<String, Object> entry : map.entrySet()) { 
     if (entry.getValue() instanceof Map) { 
      @SuppressWarnings("unchecked") 
      Map<String, Object> tempMap = flatten((HashMap<String, Object>) entry.getValue()); 
      for (Entry<String, Object> tempEntry : tempMap.entrySet()) { 
       newMap.put(entry.getKey()+"."+tempEntry.getKey(), tempEntry.getValue()); 
      } 
     } else { 
      newMap.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    return newMap; 
} 
+0

請解釋你的代碼。無論如何:我不確定你的答案的附加價值是什麼,因爲它看起來像[這個答案](https://stackoverflow.com/a/12143746/1251613)的稍微修改副本。所以你也應該解釋你的增值是什麼。否則,我認爲答案應該被標記爲「不是答案」。 – Markus