2017-04-11 46 views
-3

如何嵌套地圖轉換到一個列表:如何嵌套地圖轉換到一個列表<Object>

的地圖是:

Map<Integer, Map<Integer, Map<String, Double>>> list 

Object類是:

public class employee { 
private Integer id; 
private Integer number; 
private String name; 
private Double salary; 

如何將嵌套的地圖轉換爲列表?

+1

List?什麼名單? –

+0

什麼名單?什麼號碼?地圖包含什麼?關鍵是什麼?價值是什麼? – vefthym

+0

好主意!從一個我不知道如何發生的地圖結構轉換爲大多數目的,很難用於一個很好的面向對象的設計。 –

回答

3

迭代映射條目。對於每個內部映射,還遍歷其條目等。對於最內層映射中的每個條目,創建一個Employee並將其添加到列表中。

迭代映射的標準方法是遍歷其條目集。 vefthym的答案告訴你如何用for循環做到這一點。您可以將該代碼闡述爲您需要的內容。

如果你可以使用Java 8,你也可以用流來完成。我假設你的外層地圖從ID映射到中間地圖(我期望中間地圖只能容納一個入口;但是我的代碼將會也可以更多或更少)。下一個地圖從數字映射到從名稱到薪水的地圖。

List<Employee> empls = list.entrySet() 
      .stream() 
      .flatMap(oe -> oe.getValue() 
        .entrySet() 
        .stream() 
        .flatMap((Map.Entry<Integer, Map<String, Double>> me) -> me.getValue() 
          .entrySet() 
          .stream() 
          .map((Map.Entry<String, Double> ie) 
            -> new Employee(oe.getKey(), me.getKey(), ie.getKey(), ie.getValue())))) 
      .collect(Collectors.toList()); 

這本來是爲oe外進入,也就是,在外部映射條目。內部條目類似地爲me,中間條目爲ie。我已經將您的類重命名爲首字母大寫E,以遵循Java命名約定,並且我假設了一個方便的構造函數。

編輯:vefthym,你的答案現在在哪裏,我指的是它?我知道你自己並不高興,這很公平。

for (Map.Entry<Integer, String> currentEntry : yourMap.entrySet()) { 
     // do your stuff here 
     // use currentEntry.getKey() and currentEntry.getValue() to get the key and value from the current entry 
    } 

您需要從地圖聲明中重複的類型參數的<>Map.Entry後:在任何情況下,與for循環是標準的方式來遍歷地圖。

+1

您的回答正好解決了我的問題,非常感謝! – QSY