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.

1voto

matio Punkte 367

Wie wäre es mit der Baumkarte unten:

Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));

Was auch immer Sie in diese sortedMap eingeben, es wird automatisch sortiert. Zuallererst TreeMap ist eine sortierte Implementierung von Map Schnittstelle. Es gibt ein Aber, da es die Schlüssel in [natürlicher Reihenfolge][https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html] sortiert. Wie das Java-Dokument sagt String Typ ist ein lexikografischer Typ mit natürlicher Ordnung. Stellen Sie sich die folgende Liste von Zahlen mit dem Typ String vor. Das bedeutet, dass die folgende Liste nicht wie erwartet sortiert wird.

List<String> notSortedList = List.of("78","0", "24", "39", "4","53","32");

Wenn Sie nur den Standard TreeMap Konstruktor wie unten und schieben jedes Element einzeln wie unten:

    Map<String, String> map = new TreeMap<>();
    for (String s : notSortedList) {
        map.put(s, s);
    }

    System.out.println(map);

Ausgabe ist: {0=0, 14=14, 24=24, 32=32, 39=39, 4=4, 48=48, 53=53, 54=54, 78=78}

Wie Sie sehen, Nummer 4 kommt zum Beispiel nach '39'. Dies liegt in der Natur der lexikografischen Datentypen wie String. Wenn es sich um einen Integer-Datentyp handelte, war das allerdings in Ordnung.

Um dies zu beheben, verwenden Sie das Argument, um zuerst die Länge der Zeichenkette zu überprüfen und sie dann zu vergleichen. In Java 8 wird dies wie folgt gemacht:

Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));

Es vergleicht zunächst jedes Element nach Länge und wendet dann die Prüfung nach compareTo als Eingabe dasselbe wie das Element, mit dem verglichen werden soll.

Wenn Sie es vorziehen, eine verständlichere Methode zu verwenden, ist der obige Code gleichwertig mit dem folgenden Code:

   Map<String, String> sortedMap = new TreeMap<>(
             new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    int lengthDifference = o1.length() - o2.length();
                    if (lengthDifference != 0) return lengthDifference;
                    return o1.compareTo(o2);
                }
            }
    );

Weil die TreeMap Konstruktor die Komparatorschnittstelle akzeptiert, können Sie eine noch komplexere Implementierung von Composite-Klassen erstellen.

Dies ist auch eine andere Form der vereinfachten Version.

    Map<String,String> sortedMap = new TreeMap<>(
           (Comparator<String>) (o1, o2) ->
            {
                int lengthDifference = o1.length() - o2.length();
                if (lengthDifference != 0) return lengthDifference;
                return o1.compareTo(o2);
            }
    );

-1voto

Manoj Singh Punkte 789

Wir können den Schlüssel auch mit der Methode Arrays.sort sort sortieren.

Map<String, String> map = new HashMap<String, String>();
Object[] objArr = new Object[map.size()];
for (int i = 0; i < map.size(); i++) {
objArr[i] = map.get(i);
}
Arrays.sort(objArr);
for (Object str : objArr) {
System.out.println(str);
}

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