Java Map sort by value

War ich auf der Suche nach Möglichkeiten der Sortierung Map<String, Integer> durch Werte. Ich fand dieser Beitrag, die gelöst mein Sortieren-problem, aber nicht genau. Nach der post, schrieb ich den folgenden code:

import java.util.*;

public class Sort {

    static class ValueComparator implements Comparator<String> {

        Map<String, Integer> base;

        ValueComparator(Map<String, Integer> base) {
            this.base = base;
        }

        @Override
        public int compare(String a, String b) {
            if (base.get(a) >= base.get(b)) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
        map.put("A", 1);
        map.put("B", 2);
        sorted.putAll(map);
        for (String key : sorted.keySet()) {
            System.out.println(key + " : " + sorted.get(key)); //why null values here?
        }
        System.out.println(sorted.values()); //But we do have non-null values here!
    }
}

Ausgabe:

A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)

Wie Sie sehen können aus die Ausgabe, die get Methode immer zurück null. Der Grund ist meine ValueComparator.compare() Methode kehrt nie zurück 0, die ich habe herausgefunden, indem Sie dieser Beitrag.

Schlug jemand vor, in diesem post die folgende zu lösen, die null Wert problem:

        public int compare(String a, String b) {
            if (base.get(a) > base.get(b)) {
                return 1;
            }else if(base.get(a) ==  base.get(b)){
                return 0;
            }
            return -1;  
        }

Ich habe getestet dieses Stück code und es stellt eine Schlüssel-merging problem. In anderen Worten, wenn die Werte gleich sind, Ihre entsprechenden Schlüssel zusammengeführt werden.

Ich habe auch versucht die folgenden:

            public int compare(String a, String b) {
                if (a.equals(b)) return 0;
                if (base.get(a) >= base.get(b)) {
                    return 1;
                } else return -1;
            }

Es funktioniert auch nicht. Einige der Werte sind immer noch null. Neben dieser Problemumgehung möglicherweise logischer Probleme.

Jeder kann vorschlagen, eine vollständig funktionierende Lösung zu meinem problem? Ich möchte die Art von Wert-Funktion zu arbeiten und die get Methode zur Arbeit an der gleichen Zeit.

  • Warum/wie würden Sie Sortieren eine Karte Wert? Ich denke nicht, dass das überhaupt Sinn macht... Ist das nicht was für Listen und Sets sind für? Einfach anrufen Karte.Werte() und fügen Sie die Ergebnisse in einem TreeSet oder einer geordneten Liste.
  • Wie würden Sie sich die sortierten Werte wieder auf Ihre entsprechenden Tasten? Ich will nicht behaupten Beziehung zwischen Schlüssel und Wert manuell ein.
  • OK... du willst also die Schlüssel sortiert werden basierend auf der Reihenfolge der Werte. Ich denke, ich verstehe, was Sie jetzt wollen.
  • In diesem Fall sollten Sie verwenden Sie einfach diese: return base.get(a).compareTo(base.get(b))
  • Wenn Sie bessere Lösungen als die Verwendung von Karten, es wäre auch nett 🙂
  • Ich habe gerade eine Antwort..., die Sie verwenden möchten Integer.compareTo()

InformationsquelleAutor Terry Li | 2012-12-13
Schreibe einen Kommentar