通过正常和密钥查找访问的集合

时间:2015-02-06 18:30:13

标签: java android collections

我所追求的是由数组或arraylist支持的默认无序集合,允许按键查找。或者可以按插入时间排序的关联地图。

案例如下,我有一个适配器,通过位置移动集合,插入就像一个列表,但同时我想改变单个元素,通过键找到它们而不是遍历整个列表。

我不想要的是必须从头开始重新实现整个集合,或者拦截对另一个集合的调用,因为这样会导致错误。

4 个答案:

答案 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