web-dev-qa-db-fra.com

Comparateur Java TreeMap

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());
        } 
    });
  1. Puis-je faire ce qui précède anonymement?
  2. Comment pourrais-je faire cela autrement?
  3. Je veux trier myMap par la valeur et non la clé
24
CodeKingPlusPlus

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 pour Comparator<? 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]
48
Amit Deshpande

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());
        }
    });
13
Bhesh Gurung

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());
0
ahmed soror