Java随机访问地图

时间:2010-11-18 16:20:35

标签: java collections guava apache-commons-collection

我正在寻找一个具有随机访问映射实现的开源库。 我需要一个维护其哈希索引的映射,但也会像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));

这个想法是两种类型的查找都必须快速。

一个快速的谷歌没有找到任何东西,我没有在番石榴或公共收藏中看到它(我可能忽略了它)。 我现在没有足够的时间正确实施它。

4 个答案:

答案 0 :(得分:4)

如果您的Map可以是不可变的,则可以执行以下操作:

ImmutableMap<String, String> map = ...
String v2 = map.entrySet().asList().get(2).getValue();
常规asList()的{​​{1}}上的

entrySet()只是直接使用地图自己的条目数组,因此它是随机访问并且速度很快。

答案 1 :(得分:2)

如果您的地图是静态的,或者它只是偶尔更新,您可以使用values()的{​​{1}}方法,该方法会将地图的值列表提供为LinkedHashMap。然后你可以将这个集转换为一个Collection<T>的数组,你可以不断访问这些元素,当然这会浪费一些内存来存储额外的引用,但是你要求两个特定的复杂性,所以内存交易 - 关闭是必要的。如果您在混合方式添加值时不需要获取值,那么这将很好。

唯一不同的方法是通过使用数组而不是链接列表来存储插入顺序来自己实现toArray(T[] a),但是当需要保持时,你将不得不关心arraylist的容量加倍表现足够好。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

我认为LinkedHashMap正是您所需要的。

您可以将其用作地图:

map.get("v2");

和列表:

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

如果你想编写自己的5行长的类来实现这个逻辑。