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

Sorting a HashMap based on Value then Key?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to sort a Map on the values in Java?

有一个HashMap的类型:

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

《HashMap包含一列表的字符串和整数是一个计数器的数小时,字符串已被发现。什么是我想做的是能够代表黑色的基于HashMap的integers,然后在字母顺序的字符串。

在弯矩调幅保鲜的纪录:"最大的发生(一个字命名变量的最大值)和《displaying AA follows:

1
2
3
4
5
6
7
8
9
10
public void print(){
    while(max > 0){
       for (String key : h.keySet()){
           if(h.get(key) == max){
               System.out.println(key +"" + h.get(key));
           }
       }
       max--;
    }
}

这不alphabetically黑色的值,它也accesses HashMap的马克斯·H(尺寸)表示。

什么是更好的解决方案吗?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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());
        }
    }

}

您可以将所有映射条目放入一个列表中,然后对其进行排序:

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


看看谷歌的番石榴图书馆。它有一个Multiset来为您计算,然后您有一个Ordering类来简化排序。

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


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

1
2
3
4
5
6
7
8
9
10
11
//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.");
    }
}


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