以相反的顺序迭代LinkedHashMap

Dom*_*mra 34 java hashmap

我有一个LinkedHashMap:

LinkedHashMap<String, RecordItemElement>
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*Ali 9

HashMap:

HashMap<Integer, String> map = new HashMap<Integer, String>();
Run Code Online (Sandbox Code Playgroud)

对于反向迭代值:

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

对于密钥的反向迭代:

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

对于两者的反向迭代:

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();
Run Code Online (Sandbox Code Playgroud)


use*_*508 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);
}
Run Code Online (Sandbox Code Playgroud)


Kal*_*Kal 8

您不必遍历它.但是关闭钥匙并将其存储在列表中会很方便.这是你可以做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)));
Run Code Online (Sandbox Code Playgroud)

  • @Kal您的解决方案的操作是O(n),这很好..*可怕*. (6认同)
  • 而不是keyList.indexOf(...)使用listIterator与位置.并使用previous()进行迭代 (5认同)
  • `LinkedHashMap#keySet()`返回一个由`LinkedKeySet`支持的`Set`,它是一个具有包本地可见性的嵌套类.迭代顺序由其"Spliterator"定义,其顺序与映射条目的顺序相同.因此,在这种情况下,订单是有保证的. (3认同)