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()on the entrySet()for a regularImmutableMap直接使用地图自己的条目数组,因此它是随机访问且快速的。

于 2010-11-18T17:29:27.273 回答
2

如果您的地图是静态的,或者只是偶尔更新,您可以使用values()提供LinkedHashMap地图值列表作为Collection<T>. 然后,您可以将集合转换为数组,toArray(T[] a)并且您将可以不断访问元素,当然这会浪费一些内存来存储额外的引用,但是您要求两个特定的良好复杂性,因此需要进行内存权衡。如果您在以混合方式添加值时不需要获取值,这将很好。

唯一不同的方法是LinkedHashMap自己实现 a 通过使用数组而不是链表来存储插入顺序,但是您必须在需要时将数组列表的容量加倍以保持性能足够好。

于 2010-11-18T16:39:25.313 回答
1

您想以两种不同的方式查找值。最简单/最快的方法是维护两个集合,一个 Map 和一个 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 回答