2017-09-05 2 views
2

私は、最も深い要素がListである多くのマルチレベルHashMapを持っています。レベル数は異なる場合があります。マルチレベルHashMapsをマージする最速の方法

直感的に最初のハッシュマップが

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

であり、第二のハッシュマップが

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

をした後、それは

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

それらをマージするための最良の方法は何ですか?になるべき合併であると言うことができますか一度に2つのマップを反復して結合するとよいでしょうか?

+0

マップがありますか? – ByeBye

+0

はいそれはMap

+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を追加することについてちょっと心配しています。メソッドがオブジェクトを返す場合、私はコピー/新鮮なオブジェクトを期待します。私はそれが今のように方法の意図がより明確であると思う。 –

関連する問題