我有一个 LinkedHashMap:
LinkedHashMap<String, RecordItemElement>
我需要从给定键的位置向后迭代。因此,如果给我第 10 个项目的键,我需要向后遍历哈希图 9、8、7 等。
我有一个 LinkedHashMap:
LinkedHashMap<String, RecordItemElement>
我需要从给定键的位置向后迭代。因此,如果给我第 10 个项目的键,我需要向后遍历哈希图 9、8、7 等。
该问题需要以相反的顺序使用 LinkedHashMap,一些答案建议使用 TreeSet 但这将根据键重新排序地图。
该解决方案允许迭代原始 LinkedHashMap 而不是新的 ArrayList,正如也已提出的那样:
List<String> reverseOrderedKeys = new ArrayList<String>(linkedHashMap.keySet());
Collections.reverse(reverseOrderedKeys);
for (String key : reverseOrderedKeys) {
RecordItemElement line = linkedHashMap.get(key);
}
哈希映射:
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();
您不必遍历它。但是将钥匙拔下并将其存储在列表中会很方便。那是您可以进行 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)));
new LinkedList(linkedHashMap.keySet()).descendingIterator();
使用“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;
}
这是一个老问题,但我认为它缺乏采用更新方法的答案。以下使用 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();
值得一提的是,这种方法仅在流是顺序的情况下才有效。无论如何,我们不会在这里使用并行流获得任何东西。