2017-09-05 36 views
2

我有很多Multilevel哈希映射,其中最深的元素是List。級別數量可能會有所不同。最快的方式來合併多級哈希映射

直觀地讓我們說第一個HashMap的是

{ 
    "com": { 
     "avalant": { 
      "api": [] 
     } 
    } 
} 

和第二HashMap的是

{ 
    "com": { 
     "google": { 
      "service": { 
       "api": [] 
      } 
     } 
    } 
} 

合併後,它應該成爲

{ 
    "com": { 
     "avalant": { 
      "api": [] 
     }, 
     "google": { 
      "service": { 
       "api": [] 
      } 
     } 
    } 
} 

什麼是合併它們的最好方法?只需一次迭代兩張地圖,並結合起來就是個好主意?

+0

你有Map ? – ByeBye

+0

是的,它是地圖<字符串,對象> –

+1

聲明的打字沒有什麼幫助。是否有最大數量的嵌套級別? –

回答

2

我會先與一個真正有效的版本一起使用,然後看看我是否需要更快的版本。

一個可能的解決方案是一個遞歸方法是這樣的(除去泛型和投射更容易讀):

// after calling this mapLeft holds the combined data 
public void merge(Map<> mapLeft, Map<> mapRight) { 
    // go over all the keys of the right map 
    for (String key : mapRight.keySet()) { 
     // if the left map already has this key, merge the maps that are behind that key 
     if (mapLeft.containsKey(key)) { 
      merge(mapLeft.get(key), mapRight.get(key)); 
     } else { 
      // otherwise just add the map under that key 
      mapLeft.put(key, mapRight.get(key)); 
     } 
    } 
} 

只注意到拉姆達標籤。我沒有看到在這裏使用流的理由。把它轉換成流,只會讓我覺得更復雜。

+0

這是一個整潔的解決方案。值得一提的是,mapLeft擁有最終值 –

+0

@PujanSrivastava我已經添加了關於修改參數的評論。感謝您提出的編輯。我有點擔心添加mapLeft作爲返回值。如果一個方法返回一個對象,我會期望一個複製/新對象。我認爲現在這種方法的意圖更加清晰。 –