java 以相反的顺序遍历LinkedHashMap

cpjpxq1n  于 2023-05-05  发布在  Java
关注(0)|答案(7)|浏览(291)

我有一个LinkedHashMap:

LinkedHashMap<String, RecordItemElement>

我需要从一个给定的键的位置开始向后迭代。因此,如果给我第10项的键,我需要向后迭代哈希Map9、8、7等。

8hhllhi2

8hhllhi21#

这个问题需要一个反向顺序的LinkedHashMap,一些答案建议使用TreeSet,但这将根据键重新排序Map。
该解决方案允许在原始LinkedHashMap上迭代,而不是如已经提出的新ArrayList:

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

gkn4icbw2#

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

z9ju0rcb3#

你不必遍历它。但是如果把键取下来并存储在一个列表中会很方便。这是执行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)));
q5iwbnjs

q5iwbnjs4#

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

okxuctiv5#

使用“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;
    }
luaexgnf

luaexgnf6#

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

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

上面的代码流Map的条目集,保留条目,直到找到与给定键相等的键。然后,将条目收集到ArrayDeque
但有一个细节不见了。根据您是否需要将与给定键匹配的条目也包含在结果中,您可能需要手动将其添加到双端队列中。如果你不想添加它,那么你就完成了。否则,只需执行以下操作:

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

现在,要以相反的顺序迭代Deque,只需使用它的descendingIterator()

Iterator<Map.Entry<String, RecordItemElement>> descIt = top.descendingIterator();
  • 值得一提的是,这种方法只适用于顺序的流。* 无论如何,我们在这里使用并行流不会获得任何好处。
fykwrbwg

fykwrbwg7#

JEP 431: Sequenced Collections在即将到来的Java版本21中添加了一个reversed()方法到LinkedHashMap。可以以标准方式迭代Map的该反转视图。

myLinkedHashMap.reversed().forEach(key, value -> {
  // Do something with the key and/or value
});

相关问题