2010-01-27 4 views
1

i ont la TreeMap suivante:TreeMap: valeurs de tri d'une carte avec les touches de déplacement ainsi que les valeurs

TreeMap<Integer, Double> map; 

les valeurs doubles ne sont pas uniques.

i itérez la carte en utilisant les clés Integer et les fonctions firstEntry() et higherEntry() et modifiez les valeurs Double.

Maintenant, je veux lister les valeurs des paires dans l'ordre décroissant des valeurs doubles. quelle est la meilleure façon de le faire?

ces clés Integer sont importantes pour moi et parce que les valeurs doubles ne sont pas uniques, je ne peux pas avoir une clé double.

Mise à jour: Plus Explication C'est le problème classique. disons que rollnos des étudiants est la clé et leur pourcentage est la valeur. Maintenant, trier par pourcentage et nous devrions être en mesure de dire quel pourcentage est-il. donc j'ai besoin de la clé entière.

+0

Puis-je demander ce que les Entiers représentent? Sachant que cela aiderait à proposer une autre structure de données au lieu de la TreeMap ... – pgras

+0

Pouvez-vous clarifier le titre? Ce n'est pas clair quel champ vous essayez de trier. – cmcginty

Répondre

1

vous pouvez construire une 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

le 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()); 
    } 
} 
0

Ce que vous pouvez faire est le suivant: utilisez entrySet pour parcourir les entrées. Mettez-les dans une liste. Triez la date avec le bon comparateur alors.

+0

Il ne peut pas, le TreeMap ne permet que des clés uniques. – laura

+0

putain, noobie erreur, mon mauvais. Je vais essayer de trouver une autre solution –

+0

changé la solution –

3

La solution évidente est d'obtenir une collection des doubles ( éventuellement via le entrySet puis getValue - la classe TreeMap a une méthode values(), vous pouvez simplement l'utiliser), et passez à les trier (en utilisant Collections.sort ou Arrays.sort) - cela prendrait cependant le temps O (n logn).

Je ne suis pas sûr que vous puissiez le faire d'une manière plus intelligente (== plus rapide), sauf si vous modifiez complètement la structure de données. Cependant, la seule façon dont je vois cela se produire avec une autre structure de données est de garder un wrapper sur l'entier et le double et d'écrire deux comparateurs - un qui compare le integer et un qui compare d'abord par le double puis par le integer. Le TreeMap original que vous utilisez serait le même mais vous seriez capable de détacher un autre TreeMap, trié par le second comparateur. Le détachement prendrait quand même le temps O (n logn).

Questions connexes