2017-02-15 6 views
2

Ich versuche Kartenelemente (basierend auf Werten) zu sortieren, indem ich Collections.sort() verwende. Das Problem ist, dass mein Programm die Elemente in absteigender Reihenfolge sortiert, anstatt sie in aufsteigender Reihenfolge zu sortieren. Wie kann ich es in aufsteigender Reihenfolge sortieren? Unten ist mein Code.Wie sortiere ich Kartenelemente basierend auf Werten in aufsteigender Reihenfolge in Java?

package hashTableRR; 

import java.util.*; 
import java.util.Map.Entry; 
public class OrderByValue { 

    public static void main(String [] args){ 

    Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    map.put(1, 4); 
    map.put(2, 6); 
    map.put(3, 1); 
    map.put(4, 1); 
    map.put(6, 8); 
    map.put(7, 5); 

    Set<Entry<Integer, Integer>> set = map.entrySet(); 
    List<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set); 
    Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() 
    { 
     public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2){ 
      return(o2.getValue()).compareTo(o1.getValue()); 
     } 
    } 

      ); 

    System.out.println("Keys\t\tValues"); 
    for(Map.Entry<Integer, Integer> entry:list) 
    { 
     System.out.println(" "+entry.getKey()+"\t\t "+entry.getValue()); 

    }  


    } 
} 
+2

Versuchen 'return (o1.getValue()) mit compareTo (o2.getValue());.'. Bitte beachten Sie, dass sich der Bestellstatus vergleichen lässt. – aUserHimself

+0

Vielen Dank, es hat funktioniert! – Miji05

+2

Mögliches Duplikat von [Karte sortieren nach Werten (Java)] (http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java) –

Antwort

1

Das Problem ist in Ihrer Comparator#compare Implementierung wahrscheinlich.

Sie kehren zurück: o2.getValue().compareTo(o1.getValue())

Für eine aufsteigende Reihenfolge, sollten Sie zurück: o1.getValue().compareTo(o2.getValue())

Dies wird einen negativen Wert, wenn o1 < o2, erzeugen 0 wenn sie sind gleich und ein positiver Wert, wenn o2 > o1.

Siehe leicht kryptische Dokumentation here.


Hier ist ein Einblick von welchen Werten Sie Ihre Comparator erwarten zurückzukehren, wenn ein Vergleich von Integer s in Java (full doc here) Durchführung:

der Wert 0, wenn diese Integer gleich das Argument Integer; ein Wert kleiner als 0, wenn diese Ganzzahl numerisch kleiner als das Argument Integer ist; und ein Wert größer als 0, wenn diese Ganzzahl numerisch größer ist als das Argument Integer (vorzeichenbehafteter Vergleich).

+0

Vielen Dank für Ihre Hilfe , alles von Dir. – Miji05

+0

@ Miji05 du bist willkommen. – Mena

1

Verwenden Sie einfach:

return(o1.getValue()).compareTo(o2.getValue()); 

Es wird offensichtlich umgekehrter Reihenfolge

3

einfach die Reihenfolge der Variablen in Ihrer compare Funktion

return(o1.getValue()).compareTo(o2.getValue()); 
1
Map<Integer, Integer> unsortedMap = new HashMap<>(); 
    Map<Integer, Integer> sortedMap = new LinkedHashMap<>(); 
    unsortedMap.put(1, 4); 
    unsortedMap.put(2, 6); 
    unsortedMap.put(3, 1); 
    unsortedMap.put(4, 1); 
    unsortedMap.put(6, 8); 
    unsortedMap.put(7, 5); 


    unsortedMap.entrySet(). 
      stream(). 
      sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed()). 
      forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); 

    System.out.println(sortedMap); 
ändern

Verwenden Sie , wenn Sie Ihre Daten in der Reihenfolge speichern möchten, in der Schlüssel in Map eingefügt werden. HashMap garantiert keine Bestellung.

Verwandte Themen