2016-12-20 6 views
-1

Я хотел бы перебирать значения определенного ключа для LinkedHashMultiMap<String,String> (Guava) по порядку вставки.Итерация по всем значениям для конкретного ключа в порядке, для LinkedHashMultiMap

Возможно ли это? И если да, то как?

Почему a LinkedHashMultiMap? Ну, моя существующая структура данных была HashMultiMap, и я подумал, изменил ли я ее на LinkedHashMultiMap, что было бы совместимо с моим существующим кодом, и я мог бы как-то перебирать значения.

Но, глядя на документы, я не могу понять это - я сказал, что я новичок в классе LinkedHashMultiMap.

+3

«Аналогично, get, removeAll и replaceValues ​​возвращают коллекции, которые повторяют значения в том порядке, в котором они были добавлены». Где путаница? –

ответ

3

Итерация в порядке вставки для LinkedHashMultimapis a documented behavior

Реализация Multimap, которая не допускает дубликатов записей ключ-значение и что возвращает коллекции которых итераторы следуют порядок, в котором данные были добавлены к 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 (String value : multimap.get(key)) { 

} 

Итератор для набора будет итерацию в том порядке, они были добавлены к Multimap, как указано в documentation.

Аналогично, get, removeAll и replaceValues коллекции возврата, что итерации по значениям в порядке их добавления.