我所追求的是由数组或arraylist支持的默认无序集合,允许按键查找。或者可以按插入时间排序的关联地图。
案例如下,我有一个适配器,通过位置移动集合,插入就像一个列表,但同时我想改变单个元素,通过键找到它们而不是遍历整个列表。
我不想要的是必须从头开始重新实现整个集合,或者拦截对另一个集合的调用,因为这样会导致错误。
答案 0 :(得分:3)
LinkedHashMap是您最好的选择。
它的工作方式类似于HashMap,它具有通过其Map.Entry项运行的双向链表。您可以使用列表进行迭代,并将其作为HashMap,它将为您提供O(1)查找。
您可以选择广告订单或访问顺序。
答案 1 :(得分:1)
LinkedHashMap
会让您接近带插入顺序的O(1)
答案 2 :(得分:0)
如果您需要O(1)索引查找以及O(1)按键查找,如果您不需要将新条目放入地图中,只需构建一次地图(尽管如此)可能使用Guava's ImmutableMap
修改地图中的条目,这也保留了插入顺序。与普通Map
一样,您可以按键进行查找,也可以执行map.values().asList().get(i)
,它会在恒定时间内获取元素。但是,我并不相信JDK中内置的任何内容都可以做到。
答案 3 :(得分:0)
基于@ aa333的评论我掀起了自己的实施,它可能不完整,所以欢迎提出建议。
https://gist.github.com/anonymous/7a93535a3cfb63623a54
它通过了这个Q& D测试用例:
public static void main(String[] args) {
Map<String, String> preMap = new HashMap<String, String>();
preMap.put("subZero", "-1");
preMap.put("zero", "0");
IterableLinkedMap<String, String> map = new IterableLinkedMap<String, String>();
map.putAll(preMap);
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
map.put("four", "4");
map.put("five", "5");
map.put("six", "6");
map.remove("three");
map.put("eight", "8");
map.put("seven", "7");
map.remove("one");
map.put("three", "33");
map.put("five", "actually five");
for (int i = 0; i < map.size(); i++){
System.out.println(map.getPosition(i));
}
map.clear();
System.out.println(map.getPosition(0));
}
结果:
0
-1
2
4
actually five
6
8
7
33
null