以相反的顺序迭代 LinkedHashMap

问题描述 投票:0回答:7

我有一个 LinkedHashMap:

LinkedHashMap<String, RecordItemElement>

我需要从给定键的位置向后迭代。所以如果我得到第 10 个项目的键,我需要通过 hashmap 9、8、7 等向后迭代

java hashmap linkedhashmap
7个回答
15
投票

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

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

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

11
投票

哈希图:

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();

9
投票

您不必遍历它。但是拔下钥匙并将其存储在列表中会很方便。这是您可以执行 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)));

4
投票
new LinkedList(linkedHashMap.keySet()).descendingIterator();

0
投票

使用“user22745008”解决方案和带有一些泛型的 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;
    }

0
投票

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

Deque<Map.Entry<String, RecordItemElement>> top = map.entrySet().stream()
        .takeWhile(e -> !givenKey.equals(e.getKey()))
        .collect(Collectors.toCollection(ArrayDeque::new));

上面的代码流式传输地图的条目集,保留条目直到找到等于给定键的键。然后,条目被收集到一个

ArrayDeque
.

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

top.add(Map.entry(givenKey, map.get(givenKey)));

现在,要以相反的顺序迭代

Deque
,只需使用它的
descendingIterator()

Iterator<Map.Entry<String, RecordItemElement>> descIt = top.descendingIterator();

值得一提的是,这种方法只有在流是 sequential 时才有效。 无论如何,我们在这里使用并行流不会有任何收获。


0
投票

JEP 431:Sequenced Collections 在即将到来的 Java 21 版本中为 reversed()

 添加了一个 
LinkedHashMap
 方法。地图的这种反向视图可以以标准方式迭代。

myLinkedHashMap.reversed().forEach(key, value -> {
  // Do something with the key and/or value
});
© www.soinside.com 2019 - 2024. All rights reserved.