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.
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)));
}
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()
.
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());
Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());
Collections.reverseOrder() keeps the map sorted in descending order.
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--
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.)
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.
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.
peut-être que vous avez besoin d'un NavigableMap , comme un tapis roulant.
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
Utilisation insted:
new TreeMap<>(Collections.reverseOrder())
et vous obtiendrez ce que vous voulez.