J'ai besoin d'un comparateur pour un TreeMap. Dois-je écrire cela anonymement dans le constructeur de ma TreeMap? Sinon, comment pourrais-je écrire mon comparateur. Actuellement, Java n'aime pas mon code (puis-je le faire anonymement?):
SortedMap<String, Double> myMap =
new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
{
public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
{
return o1.getValue().compareTo(o2.getValue());
}
});
Vous ne pouvez pas trier TreeMap sur les valeurs.
Une implémentation de NavigableMap basée sur l’arbre rouge-noir. La carte est triée selon l'ordre naturel de ses clés ou par un comparateur fourni au moment de la création de la carte, en fonction du constructeur utilisé Vous devrez fournir
comparator
pourComparator<? super K>
afin que votre comparateur puisse comparer les clés.
Pour pouvoir trier les valeurs, vous aurez besoin de SortedSet . Utilisation
SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Map.Entry<String, Double> e1,
Map.Entry<String, Double> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
sortedset.addAll(myMap.entrySet());
Pour vous donner un exemple
SortedMap<String, Double> myMap = new TreeMap<String, Double>();
myMap.put("a", 10.0);
myMap.put("b", 9.0);
myMap.put("c", 11.0);
myMap.put("d", 2.0);
sortedset.addAll(myMap.entrySet());
System.out.println(sortedset);
Sortie:
[d=2.0, b=9.0, a=10.0, c=11.0]
Le comparateur doit être uniquement pour la clé, pas pour l’entrée entière. Il trie les entrées en fonction des clés.
Vous devriez le changer en quelque chose comme suit
SortedMap<String, Double> myMap =
new TreeMap<String, Double>(new Comparator<String>()
{
public int compare(String o1, String o2)
{
return o1.compareTo(o2);
}
});
Mettre à jour
Vous pouvez faire quelque chose comme suit (créer une liste d'entrées dans la carte et trier la base de la liste sur la valeur, mais notez que cela ne va pas trier la carte elle-même)
List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
vous pouvez glisser la clé et la valeur. Par exemple
String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"};
int[] v = {341, 273, 278, 329, 445};
TreeMap<Integer,String>a=new TreeMap();
for (int i = 0; i < k.length; i++)
a.put(v[i],k[i]);
System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());
a.remove(a.firstEntry().getKey());
System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey());