2013-06-30 33 views
-1

我有一個數據結構以有效的方式合併列表<HashMap <Obj1, Obj2>>作爲列表<HashMap <Ob1,列表<Obj2>>?

List<HashMap<Person, Address>> 

我從我得到的Person和Address對象的列表。我做遍歷定列表後,我需要爲

List<HashMap<Person1, Address1>> 
List<HashMap<Person1, Address2>> 
List<HashMap<Person2, Address3>> 

合併地址爲每個人買些

List<HashMap<Person, List<Address>>> 

有沒有完成這件事的任何有效的方式 - 可能是有不同的方法?或者迭代列表只是選項。如果列表中包含大量數據,那麼對待它的最佳選擇是什麼?

+0

迭代的事情,設置一個標誌和所有。但是這沒有幫助。我認爲它只會使問題複雜化。 –

+2

只要做到最明顯的方法。如果你有特定的問題,那麼寫另一個問題。 –

+1

使用List over Map有什麼好處?爲什麼你需要這樣做? – Masudul

回答

1

您可以從Person改變您的地圖列表,以一個單一的地圖列表(組?)的地址如下:

Map<Person, List<Address>> restructure(List<Map<Person, Address>> data) { 
    Map<Person, List<Address>> result = new HashMap<>(); 
    for (Map<Person, Address> map : data) { 
     for (Map.Entry<Person, Address> entry : map.entrySet()) { 
      List<Address> addresses = result.get(entry.getKey()); 
      if (addresses == null) { 
       addresses = new LinkedList<>(); // or ArrayList, or ... 
       result.put(p, addresses); 
      } 
      addresses.add(entry.getValue()); 
     } 
    } 
    return result; 
} 
2

您可以使用谷歌集合Multimap之

List<HashMap<Person, Address>> list = ... 
    HashMultimap<Person, Address> mm = HashMultimap.create(); 
    for (HashMap<Person, Address> m : list) { 
     for(Entry<Person, Address> e : m.entrySet()) { 
      mm.put(e.getKey(), e.getValue()); 
     } 
    } 

注意,它可容納人數和他們的地址,而不列出

+0

請注意,'HashMultimap'不包含重複的鍵值對 - 它更類似於'Map >'。 –

+0

另外Spring有''LinkedMultiValueMap'](http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/util/LinkedMultiValueMap.html),它擴展了'Map >'。 –

相關問題