TreeMap:Trier les valeurs d'une carte avec les touches de déplacement le long avec des valeurs

StackOverflow https://stackoverflow.com/questions/2145853

  •  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.

Était-ce utile?

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 entrySet et puis getValue - la classe TreeMap a un 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top