2011-11-01 32 views
16

que tiene este HashMap:Java clase HashMap por valor

HashMap<String, Integer> m 

que básicamente almacena alguna palabra (String) y su frecuencia (número entero). El siguiente código es ordenar el HashMap por valor:

public static Map<String, Integer> sortByValue(Map<String, Integer> map) { 
     List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>(map.entrySet()); 

     Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 

      public int compare(Map.Entry<String, Integer> m1, Map.Entry<String, Integer> m2) { 
       return (m2.getValue()).compareTo(m1.getValue()); 
      } 
     }); 

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

Ahora el escenario ha cambiado y tengo esto:

HashMap<String, doc>; 

class doc{ 
integer freq; 
HashMap<String, Double>; 
} 

¿Cómo puedo solucionar esto HashMap por valor, siguiendo el mismo criterio que sortByValue ?

Respuesta

5

usted tiene que crear un comparador personalizado como este:

import java.util.Comparator; 
import java.util.Arrays; 

public class Test { 
    public static void main(String[] args) { 
String[] strings = {"Here", "are", "some", "sample", "strings", "to", "be", "sorted"}; 

Arrays.sort(strings, new Comparator<String>() { 
    public int compare(String s1, String s2) { 
    int c = s2.length() - s1.length(); 
    if (c == 0) 
     c = s1.compareToIgnoreCase(s2); 
    return c; 
    } 
}); 

for (String s: strings) 
    System.out.print(s + " "); 
    } 
} 
+1

Er, excepto que no es un HashMap aunque .. –

1

@jackturky en lugar de

public int compare(String s1, String s2) { 
    int c = s2.length() - s1.length(); 
    if (c == 0) 
     c = s1.compareToIgnoreCase(s2); 
    return c; 
    } 

por qué no escribir como (esto por supuesto comprobar cadena nula y vacía)

public int compare(String s1, String s2) { 
      return s1.compareToIgnoreCase(s2); 
    }