如何根据值来对HashMap的元素进行排序?

时间:2012-10-16 16:51:44

标签: java sorting data-structures hashmap

我有以下HashMap

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

根据值来订购它的最简单方法是什么?

4 个答案:

答案 0 :(得分:8)

您无法按值排序Map,尤其是HashMap,而这些值根本无法排序。

相反,您可以对条目进行排序:

List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
  public int compare(
      Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
    return entry1.getValue().compareTo(entry2.getValue());
  }
});

将按计数的升序对条目进行排序。

答案 1 :(得分:3)

您可以使用Set从地图中获取一组条目(Map.Entry map.entrySet())。只需迭代它们,然后按getValue()检查值。

答案 2 :(得分:1)

TreeMap可以按照Comparator定义的顺序保留其条目。

  1. 我们可以创建一个比较器,通过将最大值放在第一位来对Map进行排序。
  2. 然后,我们将构建一个使用该Comparator的TreeMap。
  3. 然后,我们会将counts地图中的所有条目放入比较器。
  4. 最后,我们将在地图中get the first key,这应该是最常见的单词(或者至少有一个单词,如果多个单词具有相同的计数)。

    public class Testing {
        public static void main(String[] args) {
    
            HashMap<String,Double> counts = new HashMap<String,Integer>();
    
            // Sample word counts
            counts.put("the", 100);
            counts.put("pineapple",5);
            counts.put("a", 50);
    
            // Step 1: Create a Comparator that order by value with greatest value first
            MostCommonValueFirst mostCommonValueFirst =  new MostCommonValueFirst(counts);
    
            // Step 2: Build a TreeMap that uses that Comparator
            TreeMap<String,Double> sortedMap = new TreeMap<String,Integer (mostCommonValueFirst);
    
            // Step 3: Populate TreeMap with values from the counts map
            sortedMap.putAll(counts);
    
            // Step 4: The first key in the map is the most commonly used word
            System.out.println("Most common word: " + sortedMap.firstKey());
        }
    }
    
    private class MostCommonValueFirst implements Comparator<String> {
       Map<String, Integer> base;
    
       public MostCommonValueFirst(Map<String, Integer> base) {
          this.base = base;
       }
    
       // Note: this comparator imposes orderings that are inconsistent with equals.    
       public int compare(String a, String b) {
          if (base.get(a) >= base.get(b)) {
              return 1;
          } else {
             return -1;
          } // returning 0 would merge keys
       }
     }
    
  5. 来源:https://stackoverflow.com/a/1283722/284685

答案 3 :(得分:0)

解决方法,如果你想按顺序打印它们(不存储)。

  1. 创建一个新地图(tempMap)并将您的值作为键和键作为值。要使密钥唯一,请在每个密钥中添加一些唯一值,例如key1 = value1 + @ 0。

  2. 将值列表map.values()列为myVlues

  3. myVlues列表排序为Collections.sort(myVlues)

  4. 现在迭代myVlues,从key获取相应的tempMap,恢复密钥,例如key.substring(0,key.length-2)并打印键和值对。

  5. 希望这有帮助。