2017-05-11 1 views
0

Ich habe einen Datensatz wie folgt aus:Wie HashMap Elemente von max drucken auf min

water, 5 
eggs, 3 
juice, 7 
bread, 4 

i alle diese speichern in

HashMap<String, Integer> dataSet = new LinkedHashMap<String,Integer>(); 

Jetzt möchte ich eine Funktion erstellen, um die Elemente drucken von max integer min:

juice, 7 
water, 5 
bread, 4 
eggs, 3 

ich denke, dass der einfachste Weg, dies zu tun, um eine Kopie von HashMap dataSet zu erstellen ist und dann muss ich r un die HashMapCopy, finde das Maximum, drucke das max Element und entferne es aus der Liste.

private static void printMaxToMin(){ 
    dataSetCopy = new LinkedHashMap<String,Integer>(dataSet); 

} 

Wie kann ich die ganze Liste laufen, die max finden, jedes Mal, das Paar von Elementen mit dem Maximalwert ausdrucken und dann löschen?

+1

Mögliches Duplikat [Java Karte sortiert nach Wert] (http: // stackoverflow.com/questions/13852725/java-map-sort-by-value) – niceman

Antwort

5

Hier ist eine Art der Sortierung nach Wert.

dataSet.entrySet().stream() 
      .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) 
      .forEach(x -> { 
       System.out.println(x.getKey() + ","+ x.getValue()); 
      }); 

Ergebnis:

juice,7 
water,5 
bread,4 
eggs,3 
+2

diese Antwort ist definitiv besser als meins. Du solltest es benutzen. –

0

Ja, das wäre sicherlich funktionieren. Etwas schöner wäre es, alle Elemente zu einer Liste hinzuzufügen und sie dann zu sortieren.

Um dies zu tun, erstellen Sie eine Wrapper-Klasse, die einen String und eine Ganzzahl enthält, die Comparable implementiert. Zum Beispiel, mit Integer vergleichen und wenn sie gleich sind Zeichenkette vergleichen.

0

Sie können eine Map-Sortierung nicht automatisch nach einem Wert sortieren (es sei denn, Sie erstellen einen benutzerdefinierten Map-Typ). Ich würde empfehlen, sorting the map by its values jedes Mal, wenn Sie die Karte drucken müssen.

0

Die Antwort von @ Aominè ist perfekt mit Java-8 in canse Sie nicht verwenden Java-8 können Sie auf diese Weise verwenden.

Sie können Ihre Karte zu List<Entry<String, Integer>> konvertieren und Sie Collections.sort zum Beispiel verwenden können:

List<Entry<String, Integer>> list = new LinkedList<>(dataSet.entrySet()); 
Collections.sort(list, (o1, o2) -> { 
    return -(o1.getValue() - o2.getValue()); 
    //  ^--------------------------------Note the (-) to reverse the order 
}); 
System.out.println(list); 

Ausgänge

juice=7 
water=5 
bread=4 
eggs=3