TreeMap:Trier les valeurs d'une carte avec les touches de déplacement le long avec des valeurs
-
23-09-2019 - |
Question
j'ai le texte suivant TreeMap:
TreeMap<Integer, Double> map;
le Double des valeurs ne sont pas uniques.
je itérer sur la carte à l'aide d'Entiers touches et les fonctions firstEntry() et higherEntry() et modifier les valeurs Doubles.
Maintenant, je veux lister les valeurs des paires dans l'ordre décroissant de valeurs Doubles.quelle est la meilleure façon de le faire?
ceux Entier clés sont importants pour moi, et parce que le Double des valeurs ne sont pas uniques, je ne peut pas avoir un Double de clés.
Mise à jour:Plus D'Explication c'est le problème classique.disons rollnos des étudiants, c'est la clé, et leur pourcentage est de la valeur.maintenant trier par pourcentage et alors nous devrions être en mesure de dire dont le pourcentage est-il.donc j'ai besoin de la clé entière.
La solution
vous pouvez construire un TreeSet
, qui garantit l'ordre d'insertion:
@Test
public void treeMapSortedByValue() {
// given the following map:
TreeMap<Integer, Double> map = new TreeMap<Integer, Double>();
map.put(2, Math.E);
map.put(1, Math.PI);
map.put(3, 42.0);
// build a TreeSet of entries
Set<Map.Entry<Integer, Double>> sortedEntries = new TreeSet<Map.Entry<Integer, Double>>(new DoubleComparator());
sortedEntries.addAll(map.entrySet());
// optionally you can build a List<Double> with the sorted
List<Double> doubles = new LinkedList<Double>();
for (Map.Entry<Integer, Double> entry : sortedEntries) {
doubles.add(entry.getValue());
}
}
cela devrait vous donner: [2.718281828459045, 3.141592653589793, 42.0]
(nb: [Math.E, Math.PI, Math.UNIVERSAL_ANSWER]
:-).
PS
l' Comparator
:
class DoubleComparator implements Comparator<Map.Entry<Integer, Double>> {
@Override
public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
return Double.compare(o1.getValue(), o2.getValue());
}
}
Autres conseils
La solution évidente est d'obtenir une collection de doubles (éventuellement par l'intermédiaire de la - la classe TreeMap a un entrySet
et puis getValue
values()
méthode, vous pouvez l'utiliser), et de procéder à un tri (à l'aide de Collections.sort
ou Arrays.sort
) - ce serait, cependant, prendre en O(n logn) de temps.
Je ne suis pas sûr que vous pouvez le faire plus intelligemment (== plus rapide), sauf si vous changez complètement la structure de données.Cependant, la seule manière que j'ai de voir ce qui se passe avec une autre structure de données est de garder un wrapper sur l'entier et le double et l'écriture de deux éléments de comparaison qui compare l' integer
et celui qui compare d'abord par l' double
et puis par la integer
.L'original TreeMap vous utilisez serait la même, mais vous seriez en mesure de détacher un autre TreeMap d'elle, triés par le deuxième élément de comparaison.Détacher encore O(n logn) temps si.
Ce que vous pouvez faire est ce qui suit: Utiliser entrée pour itérer à travers les entrées. Mettez-les dans une liste. Trier la date avec le bon comparateur.