web-dev-qa-db-fra.com

TreeMap comment trier

Comment fonctionne le TreeMap? disons par exemple que vous avez la carte suivante:

TreeMap<String, Integer> treemap = new TreeMap<>();
treemap.put("lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);

Iterator ittwo = treemap.entrySet().iterator();
    while (ittwo.hasNext()) {
    Map.Entry pairs = (Map.Entry)ittwo.next();
    System.out.println(pairs.getKey() + " = " + pairs.getValue());
    ittwo.remove();
}

La sortie de ceci est:

Jesper = 3
Marc = 2
lol = 1

Donc, si ce n'est pas par ordre alphabétique, qu'est-ce que c'est alors?

17
Marc Rasmussen

Il est non seulement alphabétique, mais il est également sensible à la casse supérieure/inférieure.

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>();
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

Production:

Jesper = 3
Lol = 1
Marc = 2
jesper1 = 3
lol1 = 1
marc1 = 2

Donc, si vous n'en avez pas besoin, vous pouvez utiliser votre comparateur personnalisé et comparer la chaîne en minuscules:

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        return o1.toLowerCase().compareTo(o2.toLowerCase());
    }
});
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

Production:

Jesper = 3
jesper1 = 3
Lol = 1
lol1 = 1
Marc = 2
marc1 = 2
33
kornero

Comme indiqué dans le JavaDoc un TreeMap "... est trié selon l'ordre naturel de ses clés ... "(c'est moi qui souligne).

Ainsi, votre résultat est correct, étant donné que les minuscules l sont après majuscule M dans l'alphabet UTF.

Si vous souhaitez remplacer le comportement par défaut, vous pouvez fournir un Comparator au constructeur TreeMap.

5
Anders R. Bystrup

Comme vous n'avez transmis aucun Comparator via le constructeur, cela va donc construire un nouveau TreeMap en utilisant l'ordre naturel de ses clés.

Dans Java l'ordre naturel signifie lexicographical ordre.

2

vous obtenez en fait la sortie correcte.

J(uppercase J)>M(uppercase M)>l(lowercase l). 

les lettres majuscules sont lexcographiquement plus grandes que les lettres minuscules

1
PermGenError