So sortieren Sie HashMap-Schlüssel

8

Ich habe ein Problem

%Vor%

Ich setze einen dynamischen Schlüssel in ein Hashmap-Objekt wie folgt:

%Vor%

Endlich bekomme ich ein Ergebnis wie folgt:

%Vor%

Ich möchte Schlüsselwertpaare in der Reihenfolge desc oder asc zurückgeben. Wie kann ich das tun?

    
Naveen A 28.01.2012, 17:04
quelle

5 Antworten

20

HashMaps speichern die sortierte Reihenfolge der Schlüssel nicht definitionsgemäß. Sie können dies jedoch erreichen, indem Sie ein Array der Schlüssel über: Object[] keys = map.keySet().toArray(); erhalten. Dann sortieren Sie die Liste mit Arrays: Arrays.sort(keys); und durchlaufen schließlich jeden Schlüssel und rufen den Wert von der HashMap ab.

for(Object key : keys) { System.out.println(map.get(key)); }

Der Sortierschritt führt dazu, dass der Algorithmus in O (n lg n) statt in O (n) läuft, was unter Verwendung einer Sortierdatenstruktur möglich wäre.

Dies wird die Liste lexikographisch sortieren. Da Ihre Frage das gängige US-Datumsformat verwendet, wird die Liste nach Tag, Monat und schließlich Jahr sortiert. Dies ist wahrscheinlich nicht korrekt. Sie können entweder ein Jahr, einen Monat, ein Tag-String-Format des Datums oder ein passenderes Schlüsselobjekt verwenden. Joda-Time's DateTime und DateTimeComparator wären sehr nützlich. Verwenden Sie einfach DateTime als Schlüssel und eine DateTimeComparator-Instanz, wenn Sie Arrays.sort(keys, comparator); aufrufen.

    
allingeek 28.01.2012, 17:14
quelle
3

Keys einer Map werden in einem Set gespeichert, das nicht sortiert werden kann. Sie können dies tun, indem Sie die Schlüssel des Kartensatzes in List einfügen und stattdessen sortieren.

z.B.

%Vor%

Hier habe ich die Date Klasse verwendet ist viel besser zum Speichern von Daten als einfache Strings.

    
Mark Rhodes 28.01.2012 17:28
quelle
2

HashMap stellt keine Reihenfolge zur Verfügung, wenn Sie darüber iterieren (oder sogar garantieren, dass die Reihenfolge gleich bleibt, wenn Sie mehrfach durchlaufen). Wenn Sie eine natürliche Reihenfolge über die Schlüssel wünschen, versuchen Sie TreeMap . Beachten Sie, dass Ihre Strings dd/mm/yy formatiert sind. Wenn sie also von TreeMap bestellt werden, wird sie zuerst nach Tag und nicht nach Jahr aufsteigend angezeigt, was wahrscheinlich nicht das ist, was Sie möchten. Sie sollten entweder Zeichenfolgen wie yy/mm/dd verwenden, zur Verwendung einer Klasse wechseln, die diese Informationen besser kapselt als Date , oder Ihre eigene Comparator definieren, wenn Sie die TreeMap erstellen, die Ihre dd/mm/yy Zeichenfolgen zu sortieren weiß die richtige Reihenfolge

    
Michael Mrozek 28.01.2012 17:11
quelle
1

HashMap definiert nicht die Reihenfolge der Iteration über die Elemente. Wenn Sie Elemente nach Schlüsseln sortiert abrufen möchten, verwenden Sie stattdessen die TreeMap . Da Sie die Zeichenfolgen jedoch im Format "TT / MM / JJJJ" speichern, ist die Reihenfolge wahrscheinlich nicht die gewünschte Reihenfolge. Verwenden Sie daher entweder das Datum als Schlüssel oder mindestens die Zeichenfolge "JJJJ-MM-TT" ".

    
vitaut 28.01.2012 17:13
quelle
0

Ich würde vorschlagen, dass Sie den HashMap-Schlüssel von String zu Datum ändern, z. %Code%. Das sollte den Trick machen.

oops - mach das zu einem HashMap<Date, List<AppPrjMilestone>>

    
user949300 28.01.2012 17:10
quelle

Tags und Links