Comment itérer hashmap dans l'ordre inverse en Java

j'essaie cela depuis une heure mais je ne trouve pas la meilleure approche pour réaliser l'itération de hashmap dans l'ordre inverse, c'est le hashmap que j'ai.

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

             for(Integer key : map.keySet()) {
                List<String> value = map.get(key);
                List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
                for(int ixy = 0; ixy < value.size()-1; ixy++){
                    security.add(createItem(value.get(ixy), value.get(ixy+1))); 
                }
                adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));  
            }

j'ai vu l'exemple de TreeMap aussi bien,

             Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(map);

mais treemap donne aussi dans l'ordre croissant, ce que je veux est dans l'ordre décroissant.

14
demandé sur Bill the Lizard 2012-05-15 11:32:09

11 réponses

Hashmap n'a pas d'ordre spécifique. Mais vous pouvez utiliser TreeMap.

peut-être que cet exemple simple peut vous aider:

Map<Integer, String> map = new TreeMap<Integer, String>();
        map.put(1, "abc1");
        map.put(2, "abc2");
        map.put(3, "abc3");

        ArrayList<Integer> keys = new ArrayList<Integer>(map.keySet());
        for(int i=keys.size()-1; i>=0;i--){
            System.out.println(map.get(keys.get(i)));
        }
15
répondu Kshitij 2012-05-15 07:43:38

la meilleure approche pour réaliser itération de hashmap dans l'ordre inverse

HashMap ne définit aucun ordre particulier de son élément. Donc l'ordre à l'envers "n'est pas définie.

pour un TreeMap , vous pouvez utiliser descendingMap() .

44
répondu NPE 2012-05-15 07:33:39

Une HashMap ne pas maintenir eny ordre entre les touches.

un tapis roulant commande ses clés par leur ordre naturel, ou par l'ordre imposé par un comparateur que vous passez lors de la construction de la carte. Donc, si vous voulez avoir des clés entières ordonnées dans l'ordre inverse, construisez le TreeMap de cette façon:

Map<Integer, List<String>> sortedMap = 
    new TreeMap<Integer, List<String>>(Collections.reverseOrder());
11
répondu JB Nizet 2012-05-15 07:35:47
Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Collections.reverseOrder() keeps the map sorted in descending order.
6
répondu Ravi Jain 2012-05-15 07:39:30

vous pouvez utiliser la méthode TreeMap#descendingKeySet .

Map<Integer, List<String>> map = new TreeMap<Integer, List<String>>();

for(Integer key : map.descendingKeySet()) {
    List<String> value = map.get(key);
    List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
    for(int ixy = 0; ixy < value.size()-1; ixy++){
        security.add(createItem(value.get(ixy), value.get(ixy+1))); 
    }
    adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));
} 

référence :

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#descendingKeySet--

6
répondu Subhrajyoti Majumder 2017-06-10 11:39:04

vous ne pouvez pas itérer sur un HashMap à l'envers à cause de ce :

Cette classe ne donne aucune garantie quant à l'ordre de la carte; en particulier, il ne garantit pas que la commande restera constante au fil du temps.

ce que vous devez utiliser est un LinkedHashMap :

cette implémentation diffère de HashMap en ce que il maintient une liste doublement liée parcourant toutes ses entrées. Ce lié list définit l'ordre d'itération, qui est normalement l'ordre les clés ont été insérées dans la carte (d'insertion). Notez que l'ordre d'insertion n'est pas affecté si une clé est réinsérée dans la carte. (Une touche k est réinsérée dans une map M if M. put (k, v) est invoqué lorsque M. containsKey (k) retournerait true immédiatement avant le invocation.)

4
répondu npinti 2012-05-15 07:34:58

le hashmap n'est pas une collection commandée. Utilisez TreeMap à la place, qui a descendingKeySet pour l'itération inverse. Voir le javadoc . LinkedHashMap est également un bon choix.

4
répondu zeller 2012-05-15 07:35:51
    TreeMap<Integer, String> map = new TreeMap<Integer, String>();
    map.put(1, "abc1");
    map.put(2, "abc2");
    map.put(3, "abc3");
    NavigableMap<Integer, String> nmap = map.descendingMap();
    for (NavigableMap.Entry<Integer, String> entry : nmap.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }

Une mise en œuvre de NPE idée.

3
répondu Bruce 2016-11-23 17:38:46

peut-être que vous avez besoin d'un NavigableMap , comme un tapis roulant.

2
répondu viaclectic 2012-05-15 07:35:07

mais treemap donne aussi dans un ordre ascendant, ce que je veux est dans l'ordre décroissant.

mettre en œuvre un Comparator qui le comparera à l'inverse de l'ordre naturel et puis juste itérer normalement vous aurez itération inverse

2
répondu Jigar Joshi 2012-05-15 07:39:34

Utilisation insted:

new TreeMap<>(Collections.reverseOrder())

et vous obtiendrez ce que vous voulez.

1
répondu Vitalij Chepelev 2017-03-18 12:14:38