2012-08-29 27 views
33

¿Cómo puedo ordenar un LinkedHashMap en función de sus valores dado que LinkedHashMap contiene String e Integer? Así que tengo que ordenarlo en función de los valores que son enteros. Muchas graciasOrdenando LinkedHashMap

+2

¿Tiene que usar un LinkedHashMap? TreeMap podría ayudar? – RNJ

+2

esto puede ayudar a http://stackoverflow.com/questions/780541/how-to-sort-hash-map – RNJ

+0

Oh. Ya veo. No me molesté en leer los comentarios.^_^ – DankMemes

Respuesta

26

Este es ahora un poco más fácil con Java 8 corrientes: no es necesario el mapa intermedio para ordenar:

map.entrySet().stream() 
    .sorted(Map.Entry.comparingByValue()) 
    .forEach(entry -> ...); 
4

LinkedHashMap simplemente mantiene la orden de inserción. Si desea ordenar según el valor, es posible que deba escribir su propio comparator.

+1

Brillante, sí, muchas gracias, escribí mi propio comparador – Ramin

+1

No creo que necesite escribir su propio comparador. 'Map.Entry.comparingByValue()' debería generar uno para usted. Y puede ser revertido por 'Collections.reverseOrder (Map.Entry.comparingByValue())'. – sprinter

+0

@sprinter: ¿Qué pasa si el valor es tipo de cualquier objeto personalizado? – kosa

66
List<Map.Entry<String, Integer>> entries = 
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){ 
    return a.getValue().compareTo(b.getValue()); 
    } 
}); 
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); 
for (Map.Entry<String, Integer> entry : entries) { 
    sortedMap.put(entry.getKey(), entry.getValue()); 
} 
+4

¡Maldición, estaba escribiendo exactamente el mismo código! :) Excepto por la última parte, no creo que OP realmente necesite tenerlos de vuelta en un mapa. –

+0

muchas gracias. pieza muy útil de código – Ramin

+0

Nice answer. Tuve que ordenar en orden descendente, así que agregué un signo -ve al devolver el valor del Comparador. –

1
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.NavigableMap; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class HashMapTest { 

public static void main(String[] args) { 

    Map<String, Integer> map=new LinkedHashMap<String, Integer>(); 

    map.put("a", 11); 
    map.put("B", 12); 
    map.put("c", 3); 
    map.put("d", 4); 
    map.put("e", 5); 
    map.put("f", 6); 
    map.put("g", 7); 
    map.put("h", 8); 
    map.put("i", 9); 
    map.put("j", 3); 
    map.put("k", 2); 
    map.put("l", 1); 

    List<Map.Entry<String, Integer>> entries = new 
    ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(entries,new CustomizedHashMap()); 


      Map<String, Integer> sortedMap = new LinkedHashMap<String, 
    Integer>(); 
      for (Map.Entry<String, Integer> entry : entries) { 
       sortedMap.put(entry.getKey(), entry.getValue()); 
       System.out.print(sortedMap.put(entry.getKey(), 
      entry.getValue())+" "); 
      } 
    } 
    } 

class CustomizedHashMap implements Comparator<Map.Entry<String, Integer>> { 

    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
    // TODO Auto-generated method stub 
    return -o1.getValue().compareTo(o2.getValue()); 
    } 

}