2017-03-13 6 views
0

私は2つを持っていますList<Map<String, String>>私はDBMSを照会しているかのようにLEFT OUTER JOINしたい交差するデータを持つオブジェクト。ここでは、各リストの地図の説明は次のとおりです。Java 6のList <Map <String、String >>オブジェクトを使用して 'LEFT OUTER JOIN'をシミュレートするにはどうすればよいですか?

マップAキー: ID、リソース、アドレス

リスト1つのデータ:

[ 
(id=1, resource="a", address="123 abc"), (id=2, resource="b", address="987 xyz") 
] 

地図Bキー: ID、名前

リスト2のデータ:

[ 
(id=1, name="ZYX"), (id=1, name="WVU") 
] 

私は何だろう「ID」キーに一致すると、次のList<Map<String, String>>で終わるされてやりたい:

[ 
(id=1, resource="a", address="123 abc", name="ZYX"), 
(id=1, resource="a", address="123 abc", name="WVU"), 
(id=2, resource="b", address="987 xyz") 
] 

最初に私がCollections.compare()を使用してみました。最初の一覧から各項目をとる

  1. >最初の項目と新しい項目に「ID」に一致する(もしあれば)から項目をマージ第List<Map<String, String>>
  2. に対応する項目を見つける
  3. ではなく、他の側に、片側に登録しよ処理する新しいList<Map<String, String>>

に新しいアイテムを追加します。私はいつも 'id' = 1のレコードと 'id' = 2のレコードを持っています。

私はこれは、Java 8以上でStreamsを使用してはるかに容易になることを承知しているが、私はこれは不明であるJavaの6

+0

で立ち往生しています。マップ 'B'には、キーが' id'であると仮定して重複キーがあります。キーが_both_ 'id'と' name'で構成されている場合、 'A'には' name'がないので、マップ 'Aには何も一致しません。これ以上明確にする必要があります。 –

+0

@JimGarrisonマップBはありません。マップのリストです。キーのセットが同じで、いくつかは同じ値にマッピングされています。 – shmosel

+0

OK、私はそれを参照してください、しかし、私は、文の 'Map A keys:id、resource、address'は' Map key:id、value:(resource、address) 'でなければなりません。 –

答えて

0
List<Map<String, String>> merged = new ArrayList<Map<String, String>>(); 
for (Map<String, String> map1 : list1) { 
    boolean found = false; 
    for (Map<String, String> map2 : list2) { 
     if (map1.get("id").equals(map2.get("id"))) { 
      found = true; 
      Map<String, String> copy = new HashMap<String, String>(); 
      copy.putAll(map1); 
      copy.putAll(map2); 
      merged.add(copy); 
     } 
    } 
    if (!found) { 
     merged.add(map1); 
    } 
} 
+0

私の作家のブロックを助けてくれてありがとう。私はあなたの例を試して、報告します。 – bakoyaro

+0

助けてくれてありがとう! (私はあなたの答えをupvoted ...) – bakoyaro

関連する問題