44 votes

Itération via une LinkedHashMap dans l'ordre inverse

J'ai une LinkedHashMap :

LinkedHashMap<String, RecordItemElement>

que j'ai besoin d'itérer à partir de la position d'une clé donnée, vers l'arrière. Donc, si on me donnait la clé du 10ème élément, j'aurais besoin d'itérer en arrière à travers les hashmaps 9, 8, 7, etc.

16voto

user2274508 Points 38

La question nécessite un LinkedHashMap dans l'ordre inverse, certaines réponses suggérant d'utiliser un TreeSet, mais cela réorganisera la carte en fonction de la clé.

Cette solution permet l'itération sur la LinkedHashMap d'origine et non sur la nouvelle ArrayList comme cela a également été proposé :

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

11voto

Ali Points 1597

La HashMap :

HashMap<Integer, String> map = new HashMap<Integer, String>();

Inverser l'itération sur les valeurs :

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

Itération inverse des touches :

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

itération inverse sur les deux :

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

9voto

Kal Points 14230

Vous n'avez pas à répéter à travers elle. Mais il serait pratique de retirer les clés et de les stocker dans une liste. C'est la seule façon d'effectuer des opérations de type 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)));

4voto

marcolopes Points 1861
new LinkedList(linkedHashMap.keySet()).descendingIterator();

3voto

Anton Points 341

Je dirais d'utiliser TreeMap pour ça. Alors vous n'avez pas besoin de copier toute la collection si vous voulez y accéder dans n'importe quel ordre. Faites attention que la clé doit prendre soin de la commande.

TreeMap map = new TreeMap();
map.put(1, "c");
map.put(2, "b");   
map.put(3, "a");    
NavigableSet set = m.descendingKeySet();

Ou jetez un œil à org.apache.commons.collections.*

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/OrderedMap.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X