2011-11-01 3 views
16

mam ten HashMap:Java HashMap sortowania według wartości

HashMap<String, Integer> m 

które zasadniczo przechowuje dowolne słowo (String) i jego częstotliwość (całkowita). Poniższy kod jest zamawianie HashMap przez wartość:

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

Teraz scenariusz się zmieniła i mam to:

HashMap<String, doc>; 

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

Jak mogę rozwiązać ten HashMap przez wartość, według tej samej metody jak sortByValue ?

Odpowiedz

5

Musisz utworzyć własny komparator tak:

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, ale to nie jest HashMap, ale ... –

1

@jackturky zamiast

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

dlaczego nie napisać jak (to oczywiście sprawdzanie zerowej i pustym ciągiem)

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