2016-04-20 29 views
2
private static <K, V extends Comparable<? super V>> Map<K, V> 
    sortByValue(Map<K, V> map) 
    { 
     Map<K, V> result = new LinkedHashMap<>(); 
     Stream<Map.Entry<K, V>> st = map.entrySet().stream(); 

     st.sorted(Map.Entry.comparingByValue()) 
       .forEachOrdered(e -> result.put(e.getKey(), e.getValue())); 

     return result; 
    } 

Dies ist ein Beispiel aus this post. Es klappt. Das Problem ist, dass es in aufsteigender Reihenfolge sortiert. Wie kann ich es in absteigend ändern?Karte in absteigender Reihenfolge sortieren java8

Ich kann das tun, wie folgt:

public static <K, V extends Comparable<? super V>> Map<K, V> 
sortByValue(Map<K, V> map) 
{ 
    List<Map.Entry<K, V>> list = 
      new LinkedList<Map.Entry<K, V>>(map.entrySet()); 
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() 
    { 
     public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) 
     { 
      return (o2.getValue()).compareTo(o1.getValue());//change o1 with o2 
     } 
    }); 

    Map<K, V> result = new LinkedHashMap<K, V>(); 
    for (Map.Entry<K, V> entry : list) 
    { 
     result.put(entry.getKey(), entry.getValue()); 
    } 
    return result; 
} 

ich tun kann, dass ich diese Linie durch Ändern Ordnung: return (o2.getValue()).compareTo(o1.getValue()); Aber ich würde mit Lambda ausdr ausprobieren.

+1

bevor wir das beantworten, [was hast du versucht, selbst] (/ help/how-to-ask)? Wo hast du nach der Antwort gesucht, woran hast du gedacht, hast du die Dokumentation für die API-Aufrufe, die du in diesem Code siehst, nachgeschlagen? –

+1

Übrigens, verwenden Sie '.forEach/.forEachOrdered' nicht, um Einträge zur Karte hinzuzufügen, verwenden Sie stattdessen" Collect "mit' Collectors.toMap'. –

Antwort

6

können Sie Comparator's default method reversed() verwenden das Gefühl der Vergleiche zu umkehren es absteigend zu sortieren.

Der Typ Inferenz scheint hier ein wenig zu sein, aber die Bereitstellung von expliziten Typargumenten zu comparingByValue() behebt das Problem.

st.sorted(Map.Entry.<K, V>comparingByValue().reversed()) 
     .forEachOrdered(e -> result.put(e.getKey(), e.getValue())); 
0

Sie können den bereits bereitgestellten Vergleicher verwenden und den Rückgabewert compareTo mit -1 multiplizieren oder einfach die Argumente vertauschen (um die Eckfälle zu berücksichtigen).

(a,b)-->{comparingByValue().compareTo(b,a)} 
+0

Warum nicht einfach 'compareTo (b, a)'? –

+0

Mathematisch sind beide Dinge äquivalent, leistungsfähiger ist Ihre Version schneller. Am Ende glaube ich nicht, dass es wichtig ist. – HopefullyHelpful

+0

Nicht ganz gleichwertig: Der Vergleicher könnte 'Integer.MIN_VALUE' zurückgeben, um anzuzeigen, dass 'a

Verwandte Themen