2010-06-19 147 views
5

可能重复:
How to sort a Map<Key, Value> on the values in Java?根据Value对Key进行排序HashMap?

我有型的一个HashMap:

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

HashMap中包含字符串和整数的列表是一个计数器发现字符串的次数。我希望能够做的是基于Integers对HashMap进行排序,然后按字符串的字母顺序排序。

在我保持一个字(变量命名为最大值)的最大发生的记录的时刻,显示值如下:

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 max * h(size)倍。

什么是更好的解决方案?

+0

@krock很好找。是的,完全相同的问题。 – cletus 2010-06-19 03:14:13

回答

3

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

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

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."); 
    } 
} 
+1

'-1 * o1.compareTo(o2)'有缺陷。考虑'compareTo'返回'Integer.MIN_VALUE'的情况。 – 2010-06-19 04:08:20

+0

@Stephen:谢谢指出! – 2010-06-19 06:17:04

+0

实际上,我不应该编写自己的代码来颠倒自然顺序:P用'Collections.reverseOrder()'方法代替.. – 2010-06-19 06:33:00

8

这里有一个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>()); 
+0

大概,我猜是因为这样,发生次数较少的单词先来.. – 2010-06-19 06:20:27

-2

你可以使用SortedMap接口对你的HashMap进行排序。这非常简单 - 自动分拣。请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html。我没有在这里包含任何代码,但如果你需要,只需添加评论。我会给你一个示例代码。

+1

- 1,SortedMap按键排序,而不是按照排序 – whiskeysierra 2010-06-19 13:01:24

+0

这是一个映射,它可以进一步保证按照键的升序排序,按照键的自然排序进行排序(请参阅Comparable界面),也可以通过在排序映射中提供的比较器创作时间 – Vishal 2012-12-05 06:04:05

相关问题