2011-11-01 13 views
16

Ho questo HashMap:Java ordina HashMap dal valore

HashMap<String, Integer> m 

che memorizza fondamentalmente qualsiasi parola (stringa) e la sua frequenza (numero intero). Il seguente codice sta ordinando il HashMap per valore:

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; 
    } 

Ora lo scenario è cambiato e ho questo:

HashMap<String, doc>; 

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

Come posso risolvere questo HashMap per valore, seguendo lo stesso approccio sortByValue ?

risposta

5

è necessario creare un comparatore personalizzato come questo:

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, tranne che non è un HashMap però .. –

1

@jackturky invece di

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

perché non scrivere come (questo naturalmente controllo stringa nulla e vuota)

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