0

ランダム アクセス マップを実装したオープンソース ライブラリを探しています。ハッシュ インデックスを維持するマップが必要ですが、LinkedHashmap のように値を挿入順にインデックス付けするマップも必要です。要素 2. 次のようなもの:

Map m = new ArrayMap();
m.put("0", "v0");
m.put("1", "v1");
m.put("2", "v2");
m.put("3", "v3");
それから:

assertEquals("v2", m.get("2"));
assertEquals("v2", m.getAtIndex(2));

どちらのタイプのルックアップも高速でなければならないという考えです。

簡単なグーグルでは何も見つかりませんでした.Guavaまたはcommonsコレクションには表示されませんでした(見落とした可能性があります)。今はそれを適切に実装する時間がありません。

4

4 に答える 4

4

あなたMapが不変であることができるなら、あなたはこれを行うことができます:

ImmutableMap<String, String> map = ...
String v2 = map.entrySet().asList().get(2).getValue();

asList()entrySet()通常の場合ImmutableMap、マップ自体のエントリの配列を直接使用するだけなので、ランダムアクセスで高速です。

于 2010-11-18T17:29:27.273 に答える
2

マップが静的な場合、または時々更新される場合は、マップの値のリストを として提供するのvalues()メソッドを使用できます。次に、セットを配列に変換すると、要素に常にアクセスできます。もちろん、これは追加の参照を保存するためにメモリを浪費しますが、2 つの特定の複雑さを求めているため、メモリのトレードオフが必要です。値を混合して追加するときに値を取得する必要がない場合は、これで問題ありません。LinkedHashMapCollection<T>toArray(T[] a)

唯一の異なる方法はLinkedHashMap、リンクされたリストの代わりに配列を使用して挿入順序を格納することにより、独自に実装することですが、パフォーマンスを十分に維持するために、必要に応じて配列リストの容量を 2 倍にすることに注意する必要があります。

于 2010-11-18T16:39:25.313 に答える
1

2 つの異なる方法で値を検索するとします。これを行う最も簡単/最速の方法は、2 つのコレクション (1 つの Map と 1 つの ArrayList) を維持することです。

private final Map<String, String> map;
private final List<String> list;

public void put(String key, String value) {
   map.put(key,value);
   list.add(value);
}

public String get(String key) {
   return map.get(key);
}

public String get(int index) {
   return list.get(index);
}
于 2010-11-18T17:29:28.300 に答える
0

LinkedHashMap はまさにあなたが必要としているものだと思います。

マップとして使用できます:

map.get("v2");

そしてリストとして:

new ArrayList(map.values().values()).get(2);

必要に応じて、このロジックを実装する独自の 5 行のクラスを記述できます。

于 2010-11-18T16:43:56.070 に答える