以相反的顺序迭代LinkedHashMap

时间:2011-08-24 05:33:19

标签: java hashmap

我有一个LinkedHashMap:

LinkedHashMap<String, RecordItemElement>

我需要从给定键的位置向后迭代。因此,如果我获得了第10项的密钥,我需要向后遍历hashmap 9,8,7等。

6 个答案:

答案 0 :(得分:9)

HashMap:

HashMap<Integer, String> map = new HashMap<Integer, String>();

反向迭代值:

ListIterator<Sprite> iterator = new ArrayList<String>(map.values()).listIterator(map.size());
while (iterator.hasPrevious()) String value = iterator.previous();

对于反向迭代键:

ListIterator<Integer> iterator = new ArrayList(map.keySet()).listIterator(map.size());
while (iterator.hasPrevious()) Integer key = iterator.previous();

对两者进行反向迭代:

ListIterator<Map.Entry<Integer, String>> iterator = new ArrayList<Map.Entry<Integer, String>>(map.entrySet()).listIterator(map.size());
while (iterator.hasPrevious()) Map.Entry<Integer, String> entry = iterator.previous();

答案 1 :(得分:9)

这个问题需要一个反向顺序的LinkedHashMap,一些答案建议使用TreeSet,但这会根据键重新排序地图。

这个解决方案允许迭代原始的LinkedHashMap而不是新的ArrayList,因为它也被提出了:

List<String> reverseOrderedKeys = new ArrayList<String>(linkedHashMap.keySet());
Collections.reverse(reverseOrderedKeys);
for (String key : reverseOrderedKeys) {
    RecordItemElement line = linkedHashMap.get(key);
}

答案 2 :(得分:7)

您不必遍历它。但是关闭钥匙并将其存储在列表中会很方便。这是你可以做indexOf()类型操作的唯一方法。

List<String> keyList = new ArrayList<String>(map.keySet());
// Given 10th element's key
String key = "aKey";
int idx = keyList.indexOf(key);
for ( int i = idx ; i >= 0 ; i-- ) 
 System.out.println(map.get(keyList.get(i)));

答案 3 :(得分:1)

new LinkedList(linkedHashMap.keySet()).descendingIterator();

答案 4 :(得分:0)

使用&#34; user22745008&#34;解决方案和带有一些泛型的labdas你可以有一个非常简洁的解决方案作为一种方法:

  public static <T, Q> LinkedHashMap<T, Q> reverseMap(LinkedHashMap<T, Q> toReverse)
  {
      LinkedHashMap<T, Q> reversedMap = new LinkedHashMap<>();
      List<T> reverseOrderedKeys = new ArrayList<>(toReverse.keySet());
      Collections.reverse(reverseOrderedKeys);
      reverseOrderedKeys.forEach((key)->reversedMap.put(key,toReverse.get(key)));
      return reversedMap;
    }

答案 5 :(得分:0)

这是一个老问题,但我认为它缺乏采用更新方法的答案。以下使用Java 9功能:

ArrayDeque

上面的代码对地图的入口集进行流式处理,保留条目,直到找到与给定密钥相等的密钥。然后,条目被收集到top.add(Map.entry(givenKey, map.get(givenKey)));

但缺少一个细节。根据您是否需要与给定键匹配的条目也包含在结果中,您可能需要手动将其添加到双端队列中。如果你不想添加它,那么你就完成了。否则,只需:

Deque

现在,要以相反的顺序迭代descendingIterator(),只需使用其Iterator<Map.Entry<String, RecordItemElement>> descIt = top.descendingIterator();

input

值得一提的是,只有当流顺序时,此方法才有效。无论如何,我们在这里使用并行流不会获得任何东西。

相关问题