来自LinkedHashMap中特定对象的迭代器

时间:2015-07-20 16:26:57

标签: java data-structures

我有一个LinkedHashMap,我有我的密钥作为ID,我想要实现的是我能够查找一个ID,如果它存在,则从该条目到结尾有一个迭代器地图。到目前为止我尝试了什么

Map<String, Obj> map = new LinkedHashMap<>();
Iterator it = map.entrySet().iterator();

但有没有办法可以让迭代器从特定对象开始而不进行线性搜索并自己找到它?

2 个答案:

答案 0 :(得分:1)

不,LinkedHashMap中没有这样的功能。

但是您可以使用List来模拟它,但代价只需要一次遍历:

    Map<String, Object> map = new LinkedHashMap<>();
    Map<String, Integer> indexesMap = new HashMap<>(map.size());

    int index = 0;
    for (String key : map.keySet()) {
        indexesMap.put(key, index++);
    }

    List<Entry<String, Object>> entries = new ArrayList<>(map.entrySet());

    // ...

    String key = ...

    Iterator<Entry<String, Object>> iterator = entries.listIterator(indexesMap.get(key));

entries.listIterator的每次后续调用中,您将获得具有O(1)复杂度的迭代器。

修改

如果您还希望删除为O(1),则不应使用LinkedHashMap

您可以实施自己的双向链接列表,并将其节点存储在HashMap中。然后通过地图中的键搜索节点。当您获得节点时,您可以遍历链接列表中的其余后续条目,或者您可以通过从地图和链接列表中删除它来在O(1)中删除它。

答案 1 :(得分:0)

不,LinkedHashMap无法实现。 NavigableMap界面中的方法tailMap可以帮助您执行此操作(map.tailMap(key).iterator()),但LinkedHashMap TreeMap未实现此界面{{1} (可能使用自定义比较器)在您的情况下是适当的替代品,请考虑使用它。