2012-07-07 27 views
3

我用番石榴Multimap之:在列表的最後番石榴Multimap。把價值兩至年底,並開始

Multimap<Integer, String> commandMap = LinkedHashMultimap.create(); 
... 
actionMap.put(index, "string"); // Put value at the end of list. 

該命令將其值。但我需要能夠添加到最後和開始。 有沒有辦法解決這個問題?

回答

3

這不是一個ListMultimap,這是一個SetMultimap。如果您需要ListMultimap,請使用ArrayListMultimapLinkedListMultimap

3

鏈接的散列表不能用作列表,因爲它只是一個常規映射,其中保存了添加節點的順序,供您稍後使用(例如使用迭代器)。這就是爲什麼你沒有任何函數來添加一個索引的元素。

如果你想一個元素添加到LinkedHashMultimap的beggining你需要創建一個新的,加上老LinkedHashMultimap所有元素到新的一個:

Multimap<Integer, String> newMap = LinkedHashMultimap.create(); 
newMap.put(key,valueForTheFirstIndex); // first (and only) object of new map 
newMap.putAll(commandMap); // adds with the order of commandMap 
commandMap = newMap; 

的增加都將增加newMap的所有其他元素使valueForTheFirstIndex實際上停留在第一個索引中。請注意,如果你這樣做,你就失去了使用映射的優點,因爲如果總是添加到數組的起始處,那麼複雜度將是O(n^2)。如果你想添加索引,你應該在添加東西時使用列表,然後轉換爲鏈接的哈希映射以便快速訪問。


(出題範圍)

,你必須有一個名爲index不是一個指標,但實際上是一個重要的價值。你在地圖上沒有索引。

actionMap.put(index, "string"); 

正如你可以在文檔中寫着:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/LinkedHashMultimap.html

put(K key, V value) // you don't see any reference to index there 
+1

謝謝。有什麼更好的方法:新的Multimap或新的ArrayList,然後replaceValues? – Aleksandr 2012-07-07 21:48:59

+0

這實際上取決於你想要做什麼:p如果你想訪問項目放置的順序,你應該使用一個列表。 – fmsf 2012-07-07 21:56:20

+2

或者...你可以使用正確的'ListMultimap',它可以讓你像使用'List'一樣使用它...... – 2012-07-07 22:37:11