我有一个类型的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(大小)次。
什么是更好的解决方案?
答案 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。我这里没有包含任何代码,但如果您需要,只需添加注释即可。我会给你一个示例代码。