2016-12-20 56 views
-1

我想通過插入順序遍歷LinkedHashMultiMap<String,String>(Guava)的特定鍵的值。遍歷整個特定鍵的值,依次爲LinkedHashMultiMap

這可能嗎?如果是這樣,怎麼樣?

爲什麼選擇LinkedHashMultiMap?那麼,我現有的數據結構是HashMultiMap,我想如果我將其更改爲LinkedHashMultiMap,這將與我現有的代碼兼容,我可以以某種方式迭代值。

但看着文檔,我無法弄清楚 - 那就是說,我是LinkedHashMultiMap類的新手。

+3

」同樣,get,removeAll和replaceValues也會返回按它們添加順序遍歷值的集合。「混淆在哪裏? –

回答

3

迭代中插入爲了LinkedHashMultimapis a documented behavior

實施Multimap不允許重複的鍵值項,並返回集合,其迭代器按照該數據添加到多重映射排序。

並將開箱的,看到wiki page on Multimap implementations

| Implementation  | Keys behave like... | Values behave like.. | 
|:---------------------|:--------------------|:---------------------| 
| LinkedHashMultimap** | LinkedHashMap  | LinkedHashSet  | 

`**` `LinkedHashMultimap` preserves insertion order of entries, 
as well as the insertion order of keys, and the set of values associated with any one key. 

代碼示例:

LinkedHashMultimap<String, String> m = LinkedHashMultimap.create(); 

m.put("a", "foo"); 
m.put("b", "bar"); 
m.put("a", "baz"); 

m.get("a").forEach(System.out::println); // outputs "foo" and "baz" 
+0

我想我只是與get()返回一個Set而不是LinkedHashSet混淆。我想這樣做是爲了符合一個接口。 – ycomp

+0

@ycomp它並不是一成不變的,LinkedHashMultimap#get'將始終返回LinkedHashSet,因此不要嘗試進行任何強制轉換。由合同保證的**是返回的'Set'將表現得像LHS,這意味着插入順序是有保證的。 – Xaerxess

2

只需使用get,然後遍歷導致Set在for-each循環。

for (String value : multimap.get(key)) { 

} 

該組將在它們被添加到Multimap,如由documentation指定的順序遍歷該迭代。

同樣,getremoveAll,並replaceValues,通過在添加它們的順序值迭代返回集合。 「