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

neu*_*eut 6 java sorting hashtable hashmap

可能重复:
如何在Java中的值上对Map <Key,Value>进行排序?

我有一个类型的HashMap:

HashMap<String, Integer> h = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

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--;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

什么是更好的解决方案?

Sea*_*ean 10

这是一个用键和值对对象进行Comparator排序的方法:Map.EntryComparable

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

}
Run Code Online (Sandbox Code Playgroud)

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

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


Ara*_*ram 4

看看Google Guava 库。它有一个Multiset为您进行计算的类,然后您有Ordering一个可以简化排序的类。

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