65 votes

Comment trier les clés d'une Map en Java ?

C'est une question très basique, je ne suis pas très doué en Java. J'ai une Map et je veux obtenir une liste ou quelque chose comme ça des clés dans un ordre trié afin de pouvoir itérer sur elles.

90voto

erickson Points 127945

Utilisez un TreeMap qui est une mise en œuvre de l'approche SortedMap interface. Il présente ses clés dans un ordre trié.

Map<String, Object> map = new TreeMap<String, Object>();
/* Add entries to the map in any order. */
...
/* Now, iterate over the map's contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
  System.out.println(entry.getKey() + ": " + entry.getValue());
}

Si vous travaillez avec une autre implémentation de Map qui n'est pas triée comme vous le souhaitez, vous pouvez la passer à la fonction Constructeur de TreeMap pour créer une nouvelle carte avec des clés triées.

void process(Map<String, Object> original) {
  Map<String, Object> copy = new TreeMap<String, Object>(original);
  /* Now use "copy", which will have keys in sorted order. */
  ... 
}

A TreeMap fonctionne avec n'importe quel type de clé qui implémente la fonction Comparable en les mettant dans leur ordre "naturel". Pour les clés qui ne sont pas Comparable ou dont l'ordre naturel n'est pas celui dont vous avez besoin, vous pouvez implémenter votre propre Comparator et le préciser dans le Constructeur .

39voto

Michael Myers Points 82361

Vous avez plusieurs possibilités. Elles sont classées par ordre de préférence :

  1. Utilisez un SortedMap :
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    C'est largement préférable si vous voulez itérer plus d'une fois. Les clés restent triées, ce qui évite d'avoir à les trier avant l'itération.
  2. Il n'y a pas de numéro 2.
  3. Il n'y a pas de numéro 3, non plus.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

Les deux dernières vous permettront d'obtenir ce que vous voulez, mais ne devraient être utilisées que si vous ne voulez itérer qu'une seule fois et ensuite oublier le tout.

9voto

Peter Lawrey Points 229686

Vous pouvez créer une collection triée lors de l'itération mais il est plus logique d'avoir une carte triée en premier lieu. (Comme cela a déjà été suggéré)

Tout de même, voici comment faire.

Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
  // accessed in sorted order.
}

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