番石榴Multimap。把价值放在最后和开始

时间:2012-07-07 21:13:12

标签: java guava multimap

我使用Guava Multimap:

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

此命令将值放在列表的末尾。但我需要能够在结束和开始时添加两者。 有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

链接的散列图不能用作列表,因为它只是一个常规映射,其中保留了添加节点的顺序,供您稍后使用(例如,使用迭代器)。这就是为什么你没有任何函数来添加带索引的元素。

如果要在LinkedHashMultimap的初始化中添加元素,则需要创建一个新元素并将旧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;

add all会将所有其他元素添加到newMap,使valueForTheFirstIndex实际上保留在第一个索引中。请注意,如果执行此操作,您将失去使用映射的优势,因为如果始终添加到数组的开头,则复杂性将为O(n ^ 2)。如果要添加索引,则应在添加内容时使用列表,然后转换为linkedhashmap以便快速访问。


(超出范围)

您在那里名为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 :(得分:3)

这不是ListMultimap,而是SetMultimap。如果您需要ListMultimap,请使用ArrayListMultimapLinkedListMultimap