基于Value然后Key对HashMap进行排序?

时间:2010-06-19 03:06:05

标签: java sorting hashtable hashmap

  

可能重复:
  How to sort a Map<Key, Value> on the values in Java?

我有一个类型的HashMap:

HashMap<String, Integer> h = new HashMap<String, Integer>();

HashMap包含一个字符串列表,而Integer是一个计数器,用于查找String的次数。我希望能够做的是根据整数对HashMap进行排序,然后按字符串的字母顺序排序。

目前我正在记录一个单词的最大出现(变量名为max)并显示如下值:

public void print(){
    while(max > 0){
       for (String key : h.keySet()){
           if(h.get(key) == max){
               System.out.println(key + " " + h.get(key));
           }
       }
       max--;
    }
}

不按字母顺序对值进行排序,也访问HashMap最大* h(大小)次。

什么是更好的解决方案?

4 个答案:

答案 0 :(得分:10)

这是一个Comparator,用Map.Entry个键和值对Comparable个对象进行排序:

public class ValueThenKeyComparator<K extends Comparable<? super K>,
                                    V extends Comparable<? super V>>
    implements Comparator<Map.Entry<K, V>> {

    public int compare(Map.Entry<K, V> a, Map.Entry<K, V> b) {
        int cmp1 = a.getValue().compareTo(b.getValue());
        if (cmp1 != 0) {
            return cmp1;
        } else {
            return a.getKey().compareTo(b.getKey());
        }
    }

}

您将所有地图条目放入列表中,然后对其进行排序:

List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(h.entrySet());
Collections.sort(list, new ValueThenKeyComparator<String, Integer>());

答案 1 :(得分:3)

看看Google Guava libraries。它有Multiset为您计算,然后您有Ordering类,简化了排序。

您需要做的就是用字符串填充Multiset。它会为你保持频率。然后,您可以使用Ordering对这些字符串进行排序。

答案 2 :(得分:1)

可能不是最优雅的解决方案,但是这个怎么样?

//TreeSet with reversed natural ordering (big integers first)
Map<Integer, Set<String>> h = 
     new TreeMap<Integer, Set<String>>(Collections.reverseOrder());
//and use TreeSet for the set...
// ...    
// 
for(Map.Entry<Integer,Set<String>> entry : h.entrySet()){
    for(String str : entry.getValue()){
        System.out.println(str + " has occured " + entry.getKey() + " times.");
    }
}

答案 3 :(得分:-2)

您可以使用SortedMap界面对HashMap进行排序。这很容易 - 自动排序。请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html。我这里没有包含任何代码,但如果您需要,只需添加注释即可。我会给你一个示例代码。

相关问题