4 Stimmen

Sortieren einer Karte nach Schlüssel und Wert

Ich möchte eine Map nach Schlüssel und Wert sortieren. Zuerst nach dem Schlüssel, dann nach dem Wert. Zum Beispiel sollte dies das Ergebnis sein;

1,2 1,3 2,1 2,2

Hat jemand einen Vorschlag, wie man dies effektiv erreichen kann? Ich habe gesehen, Menschen mit einer TreeMap, Schlüssel zu sortieren, aber ich brauche auch Werte.

Oder ofcouse jede andere Methode der Sortierung Paare auf Schlüssel und Wert ist willkommen.

7voto

hd42 Punkte 1719
import java.util.SortedSet;
import java.util.TreeSet;

public class SortMapOnKeyAndValue {

    public static void main(String[] args) {
        SortedSet<KeyValuePair> sortedSet = new TreeSet<KeyValuePair>();
        sortedSet.add(new KeyValuePair(1, 2));
        sortedSet.add(new KeyValuePair(2, 2));
        sortedSet.add(new KeyValuePair(1, 3));
        sortedSet.add(new KeyValuePair(2, 1));

        for (KeyValuePair keyValuePair : sortedSet) {
            System.out.println(keyValuePair.key+","+keyValuePair.value);
        }
    }
}
class KeyValuePair implements Comparable<KeyValuePair>{
    int key, value;

    public KeyValuePair(int key, int value) {
        super();
        this.key = key;
        this.value = value;
    }

    public int compareTo(KeyValuePair o) {
        return key==o.key?value-o.value:key-o.key;
    }
}

3voto

Was Sie suchen, ist ein SortedSetMultimap , Teil der Guava-Bibliothek von Google. Die dort enthaltene Implementierung heißt TreeMultimap :
http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/TreeMultimap.html

Falls Sie es noch nicht kennen: Guava ist eine fantastische Bibliothek mit vielen großartigen Funktionen, von denen man manchmal denkt sollte in den Standard-Java-Bibliotheken sein. Ich denke, dass Java 8 tatsächlich einige Dinge aus Guava enthalten wird (zumindest schien mir das der Tenor dieses Artikels zu sein): http://openjdk.java.net/jeps/108 ).

1voto

Peter Lawrey Punkte 511323

Klingt, als ob Sie eine Multikarte benötigen, z. B.

SortedMap<Key, SortedSet<Value>> map = new TreeMap<Key, SortedSet<Value>>();

map.put(1, new TreeSet<Integer>(Arrays.asList(1, 2)));
map.put(2, new TreeSet<Integer>(Arrays.asList(2, 1)));

System.out.println(map);

druckt

{ 1 = {1, 2}, 2 = {1, 2}}

1voto

manku Punkte 1238

Die anderen Antworten haben auf das Problem mit den doppelten Schlüsseln hingewiesen, aber ich vermute, dass Sie Paare haben, die Sie sortieren möchten, und das Map-Bit war einfach ein Fehler. Die sauberste Lösung, die mir einfällt, ist die Erstellung einer benutzerdefinierten Pair-Klasse, die Comparator implementiert und sowohl den Schlüssel als auch den Wert von zwei Pairs vergleicht. Sie können dann Collections.sort verwenden, um diese zu sortieren.

0voto

Andreas Dolk Punkte 110776

Das ist nicht möglich, denn eine Karte kann nicht doppelte Schlüssel enthalten. A TreeMap wird immer nach dem Schlüsselwert sortiert (vorausgesetzt, der Schlüsseltyp ist Comparable ).


Aber für diese Aufgabe nehmen wir normalerweise eine Karte, deren Werte Listen sind:

Map<Integer, List<Integer>> map = new TreeMap<Integer, List<Integer>>();

// add some values in random order
List<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(1);
map.put(2,list);
list = new ArrayList<Integer>();
list.add(2);
list.add(1);
map.put(1,list);

// result
for (Integer key:map.keySet()) {   // map is already sorted
  List<Integer> value = map.get(key);
  Collections.sort(value);         // list of values needs sorting
  for (Integer innerValue:value) {
    System.out.printf("%s : %s%n", key, innerValue);
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X