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();
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)));
7条答案
按热度按时间8hhllhi21#
这个问题需要一个反向顺序的LinkedHashMap,一些答案建议使用TreeSet,但这将根据键重新排序Map。
该解决方案允许在原始LinkedHashMap上迭代,而不是如已经提出的新ArrayList:
gkn4icbw2#
HashMap:
反向迭代值:
反向迭代键:
在两者上反向迭代:
z9ju0rcb3#
你不必遍历它。但是如果把键取下来并存储在一个列表中会很方便。这是执行indexOf()类型操作的唯一方法。
q5iwbnjs4#
okxuctiv5#
使用“user22745008”解决方案和labdas以及一些泛型,你可以得到一个非常简洁的解决方案:
luaexgnf6#
这是一个老问题,但我认为它缺乏一个采取新方法的答案。以下是使用Java 9特性的示例:
上面的代码流Map的条目集,保留条目,直到找到与给定键相等的键。然后,将条目收集到
ArrayDeque
。但有一个细节不见了。根据您是否需要将与给定键匹配的条目也包含在结果中,您可能需要手动将其添加到双端队列中。如果你不想添加它,那么你就完成了。否则,只需执行以下操作:
现在,要以相反的顺序迭代
Deque
,只需使用它的descendingIterator()
:fykwrbwg7#
JEP 431: Sequenced Collections在即将到来的Java版本21中添加了一个
reversed()
方法到LinkedHashMap
。可以以标准方式迭代Map的该反转视图。