迭代一个linkedhashmap但超过一定范围

时间:2013-11-19 10:01:41

标签: java iteration linkedhashmap

所以我知道如何从一开始就遍历整个linkedhashmap,但是如果我只想链接它的某个部分呢? IE:我想从最后开始,只返回4个元素。我怎么能这样做,是否可能?

3 个答案:

答案 0 :(得分:1)

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

所以,你最终得到了两个解决方案。一,你实现了找到X个最后元素的方法:你持有,比方说一个大小为X的数组(循环缓冲区),并保留你看到的最后X个元素。如果您经常调用此方法并且X远小于地图的大小,则此解决方案的效率相当低。

第二种解决方案是保留HashMap而不是LinkedHashMap和额外List来维护广告订单。例如。 ArrayListLinkedList提供ListIterator因此向后迭代。

答案 1 :(得分:0)

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

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的基础迭代器。根据它做出你需要的东西。

答案 2 :(得分:0)

你可以通过做这样的事情来使用ListIterator

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。需要的元素。