首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历linkedhashmap,但遍历特定范围

遍历linkedhashmap,但遍历特定范围
EN

Stack Overflow用户
提问于 2013-11-19 18:01:41
回答 3查看 246关注 0票数 0

所以我知道如何从一开始就遍历整个linkedhashmap,但是如果我只想链接到其中的某个部分呢?即:我想从头开始,只返回4个元素。我如何做到这一点,这是可能的吗?

EN

回答 3

Stack Overflow用户

发布于 2013-11-19 18:12:02

您正在搜索的是一个允许您在列表中向后迭代的ListIterator。不幸的是,LinkedHashMap没有持有对前一个元素的引用,因此没有提供这个迭代器。

所以,你最终得到了两个解决方案。首先,您实现了查找最后X个元素的方法:您持有一个大小为X的数组(一个循环缓冲区),并将您看到的最后X个元素保存在那里。如果您频繁调用此方法,并且X的大小远远小于地图的大小,则此解决方案的效率会非常低。

第二种解决方案是保留HashMap而不是LinkedHashMap,并保留额外的List以保持插入顺序。例如提供ListIterator并因此提供反向迭代的ArrayListLinkedList

票数 1
EN

Stack Overflow用户

发布于 2013-11-19 18:08:46

您必须扩展标准实现并覆盖将适当迭代器返回给您自己的方法。

代码语言:javascript
复制
Iterator<K> newKeyIterator()   { return new KeyIterator();   }
Iterator<V> newValueIterator() { return new ValueIterator(); }
Iterator<Map.Entry<K,V>> newEntryIterator() { return new EntryIterator(); }

LinkedHashMap.Entry是一个双向链表,所以你也可以向前和向后移动。LinkedHashMap.LinkedHashIterator是LinkedHashMap的基本迭代器。在此基础上做出你需要的东西。

票数 0
EN

Stack Overflow用户

发布于 2013-11-19 18:17:48

您可以通过执行以下操作来使用ListIterator

代码语言:javascript
复制
List list = new ArrayList<>(map.keySet());
ListIterator li = list.listIterator(list.size());
while (li.hasPrevious()) {
    System.out.println(map.get(li.previous()));
}

由于LinkedHashMap负责维护顺序,因此您可以简单地从将按顺序排列的键创建一个列表。从最后一个索引中获取一个ListIterator,这样您就可以向后遍历一个计数器(我还没有给出它)来迭代直到no。所需元素的数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20068430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档