454 Stimmen

Wie sortiert man Map-Werte nach Schlüssel in Java?

Ich habe eine Map, die Zeichenfolgen für Schlüssel und Werte hat.

Daten sind wie Folgendes:

"Frage1", "1"
"Frage9", "1"
"Frage2", "4"
"Frage5", "2"

Ich möchte die Karte anhand ihrer Schlüssel sortieren. Am Ende werde ich also Folgendes haben question1, question2, question3 ....und so weiter.

Letztendlich versuche ich, zwei Stränge aus dieser Karte herauszuholen.

  • Erste Saite: Fragen (in der Reihenfolge 1 ..10)
  • Zweite Saite: Antworten (in der gleichen Reihenfolge wie die Frage)

Im Moment habe ich Folgendes:

Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry) it.next();
    questionAnswers += pairs.getKey() + ",";
}

So erhalte ich die Fragen in einer Reihe, aber sie sind nicht in der richtigen Reihenfolge.

727voto

Jherico Punkte 27127

Kurze Antwort

Verwenden Sie eine TreeMap . Das ist genau das, wofür es gedacht ist.

Wenn Ihnen diese Karte übergeben wird und Sie den Typ nicht bestimmen können, können Sie wie folgt vorgehen:

SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) { 
   String value = map.get(key);
   // do something
}

Dadurch wird die Karte in der natürlichen Reihenfolge der Schlüssel durchlaufen.


Längere Antwort

Technisch gesehen können Sie alles verwenden, was die SortedMap aber außer in seltenen Fällen läuft dies auf TreeMap ebenso wie die Verwendung eines Map Die Umsetzung beläuft sich in der Regel auf HashMap .

Für Fälle, in denen Ihre Schlüssel ein komplexer Typ sind, der Comparable nicht implementiert, oder Sie nicht die natürliche Reihenfolge verwenden wollen, dann TreeMap y TreeSet haben zusätzliche Konstruktoren, mit denen Sie eine Comparator :

// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
        ...
    }

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

Denken Sie bei der Verwendung eines TreeMap o TreeSet dass sie andere Leistungseigenschaften haben wird als HashMap o HashSet . Grob gesagt gehen Operationen, die ein Element suchen oder einfügen, von O(1) a O(Log(N)) .

In einem HashMap Wenn Sie von 1000 auf 10.000 Elemente wechseln, hat das keinen Einfluss auf die Zeit, die Sie für die Suche nach einem Element benötigen, aber für ein TreeMap wird die Suchzeit etwa 3 Mal langsamer (unter der Annahme, dass Log 2 ). Der Übergang von 1000 auf 100.000 wird bei jeder Suche nach einem Element etwa 6 Mal langsamer sein.

161voto

TrayMan Punkte 6755

Angenommen, TreeMap ist nicht gut für Sie (und angenommen, Sie können keine Generika verwenden):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.

79voto

Manoj Singh Punkte 789

Die Verwendung des TreeMap können Sie die Karte sortieren.

Map<String, String> map = new HashMap<>();        
Map<String, String> treeMap = new TreeMap<>(map);
for (String str : treeMap.keySet()) {
    System.out.println(str);
}

57voto

Aliti Punkte 1865

Verwenden Sie einfach TreeMap

new TreeMap<String, String>(unsortMap);

Beachten Sie, dass die TreeMap nach der natürlichen Reihenfolge ihrer "Schlüssel" sortiert ist

42voto

M-D Punkte 9997

Wenn Sie bereits eine Karte haben und sie nach Schlüsseln sortieren möchten, verwenden Sie einfach :

Map<String, String> treeMap = new TreeMap<String, String>(yourMap);

Ein vollständiges Arbeitsbeispiel :

import java.util.HashMap;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;

class SortOnKey {

public static void main(String[] args) {
   HashMap<String,String> hm = new HashMap<String,String>();
   hm.put("3","three");
   hm.put("1","one");
   hm.put("4","four");
   hm.put("2","two");
   printMap(hm);
   Map<String, String> treeMap = new TreeMap<String, String>(hm);
   printMap(treeMap);
}//main

public static void printMap(Map<String,String> map) {
    Set s = map.entrySet();
    Iterator it = s.iterator();
    while ( it.hasNext() ) {
       Map.Entry entry = (Map.Entry) it.next();
       String key = (String) entry.getKey();
       String value = (String) entry.getValue();
       System.out.println(key + " => " + value);
    }//while
    System.out.println("========================");
}//printMap

}//class

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