【问题标题】:Comparators, Collections, and HashMaps比较器、集合和 HashMap
【发布时间】:2013-03-29 23:13:05
【问题描述】:

我之前需要按其值对 HashMap 进行排序,我将比较器与集合一起使用,如下所示:

private LinkedHashMap<String, Integer> sortMap(Map<String, Integer> results, int count)
{
    List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(results.entrySet());

    Comparator<Entry<String, Integer>> comparator = new Comparator<Entry<String, Integer>>() {
        @Override
        public int compare(Entry<String, Integer> a, Entry<String, Integer> b) {
            return b.getValue().compareTo(a.getValue());
        }
    };

    Collections.sort(entries, comparator);

    LinkedHashMap<String, Integer> sorted = new LinkedHashMap<String, Integer>();
    for (Entry<String, Integer> entry : entries)
        sorted.put(entry.getKey(), entry.getValue());

    return sorted;
}

现在情况发生了变化,我需要它是一个已排序的 HashMap。所以我把代码改成这样:

private LinkedHashMap<String, Double> sortMap(Map<String, Double> results, int count)
{
    List<Map.Entry<String, Double>> entries = new ArrayList<Map.Entry<String, Double>>(results.entrySet());

    Comparator<Entry<String, Double>> comparator = new Comparator<Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> a, Entry<String, Double> b) {
            return b.getValue().compareTo(a.getValue());
        }
    };

    Collections.sort(entries, comparator);

    LinkedHashMap<String, Double> sorted = new LinkedHashMap<String, Double>();
    for (Entry<String, Double> entry : entries)
        sorted.put(entry.getKey(), entry.getValue());

    return sorted;
}

它会抛出一个错误,即java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double at:

    at myPackage.myClass$1.compare(myClass.java:124)
    at myPackage.myClass$1.compare(myClass.java:1)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at myPackage.myClass.sortMap(myClass.java:128)

myClass.java.128 : Collections.sort(entries, comparator);
myClass.java.124 : return b.getValue().compareTo(a.getValue());

如果你们能提供任何帮助,我们将不胜感激,谢谢!

【问题讨论】:

  • 尝试做一个干净的构建,看看你是否遇到同样的错误。发生此错误是因为它接收的值类型为 Integer 而不是 Double

标签: java hashmap compare


【解决方案1】:

你有两个选择:

  1. 更改排序方法以获取Integer 而不是Double

  2. entry.getValue()的返回类型改为Double!

【讨论】:

    【解决方案2】:

    您将 sortMap() 方法的签名从 Integer 更改为 Double,但仍使用 Integers 调用它。是否使用 TreeMap 来进行隐式排序?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多