3

私はGuavaMultimapを使用しています:

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

このコマンドは、リストの最後に値を置きます。しかし、私は最後と最初の両方に追加できる必要があります。これを解決する方法はありますか?

4

2 に答える 2

3

リンクされたハッシュマップは、ノードが追加された順序が保持される通常のマップであるため、リストとしては機能しません。これは、後で使用するためです (たとえばイテレータを使用)。そのため、インデックス付きの要素を追加する機能がありません。

a の先頭に要素を追加する場合は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 は、valueForTheFirstIndex実際には最初のインデックスにとどまる他のすべての要素を newMap に追加します。これを行うと、マップを使用する利点が失われることに注意してください。常に配列の先頭に追加すると、複雑さが 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
于 2012-07-07T21:17:02.027 に答える
3

これは ではなく、ListMultimapですSetMultimap。が必要な場合は、またはListMultimapを使用します。ArrayListMultimapLinkedListMultimap

于 2012-07-08T09:44:57.737 に答える