2010-11-29 2 views
0

J'ai un Map<String,String> qui a des entrées comme "User1", "43". Maintenant, je veux un "Top 3" des valeurs les plus élevées.Obtenir les 3 valeurs les plus élevées de Map <String, String>

Ce serait plus facile avec un Map<String,Integer>, mais en raison de limitations techniques, je peux simplement saisir la carte comme <String,String>.

Quel est le moyen le plus efficace de convertir une carte <String,String> en <String,Int> et de le trier?

Répondre

0

Vous pouvez parcourir les valeurs de Map (avec Map.values ​​()), les convertir en Integer (avec Integer.getInteger (String s)) et en garder la trace des 3 premiers que vous voyez. Ou, vous pouvez faire comme ci-dessus mais au lieu de garder une trace du top 3, faites une LinkedList et insérez chaque Integer à l'endroit correct (traversez LinkedList jusqu'à ce que vous trouviez où l'Integer devrait être inséré).

1

Il y a quelques façons:

  1. Créer SortedMap, par exemple TreeMap avec un comparateur -anonymous- personnalisé qui effectue des comparaisons en recherchant les clés qu'il obtient dans l'appel de la méthode compare() par rapport aux valeurs de la carte d'origine.
  2. Remplissez-le avec toutes les entrées de clé/valeur dans l'original grâce à la méthode addAll().
  3. Regardez la carte triée par valeur.
  4. Prenez la tête/queue (selon la façon dont vos types de comparaison)

similaires ci-dessus:

  1. Créer une TreeSet de clés avec un comparateur personnalisé comme ci-dessus ...
  2. Populate avec le keySet() de votre carte originale.
  3. Prenez l'ensemble tête/queue des touches.
  4. Créer une nouvelle carte à partir de ces clés et la valeur de la carte originale ...
3

Pour convertir <String, String>-<String, Integer> vous pouvez utiliser:

Map<String, Integer> treemap = new HashMap<String, Integer>(); 
for (Entry<String, String> entry : entries) { 
    treemap.put(entry.getKey(), Integer.parseInt(entry.getValue())); 
} 

Cependant, vous devrez itérer la carte à nouveau. Si vous n'avez pas besoin de toute la carte, mais plutôt du top 3, vous pouvez simplement parcourir les entrées et obtenir les trois premières par comparaison.

Ou vous pouvez inverser la clé et la valeur et utiliser un TreeMap<Integer, String> avec un Comparator, si vous avez besoin à la fois des éléments supérieurs et de l'ensemble des données.

1

Vous pouvez simplement mettre les valeurs dans une liste et le tri:

ArrayList<Integer> highest = new ArrayList<Integer>(); 
for (String value : map.values()) { 
    highest.add(Integer.parseInt(value)); 
} 
Collections.sort(highest); 
for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){ 
    System.out.println(highest.get(i)); 
} 

Si la carte est très grand, il pourrait être préférable de le parcourir et seulement sélectionner les 3 valeurs les plus élevées sans trier la liste complète .

Questions connexes