【问题标题】:Sorting Java Map by List values按列表值对 Java Map 进行排序
【发布时间】:2016-11-19 19:09:29
【问题描述】:

我需要使用以 map 和 lambda 表达式作为参数的 sorted 方法按值对 map 进行排序,而 map 的结构如下:

Map<T,List<T>>=
Groovy = [Z, Y, X, D]
Java = [V, B, C, D, A, Z]
C++ = [G, J, H]
C# = [P, S, Q, V, D]
Scala = [A, D]

我的排序方法:

sorted(Map<T,List<T>> map,Comparator<Map<T,List<T>>> comp)  

然后在另一个负责从文件读取数据并将其放入地图的函数中实现它。这是我的排序方法:

public Map<T,List<T>> sorted(Map<T,List<T>> map, Comparator<Map<T,List<T>>> comp){
    List list = new LinkedList(map.entrySet());
    Collections.sort(list, comp);
    HashMap sortedHashMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
         sortedHashMap.put(entry.getKey(), entry.getValue());
    } 
    return sortedHashMap;
  }

这就是我在另一种方法中使用它的方式:

Comparator<Map<T,List<T>>> comp = new Comparator() {
        public int compare(Object o1, Object o2) {
            return ((Comparable) ((Map.Entry) (o1)).getValue())
               .compareTo(((Map.Entry) (o2)).getValue());
         }};
iniMap=sorted(iniMap,comp);

当我运行我的程序时,出现以下错误:

java.lang.ClassCastException: java.util.LinkedList cannot be cast to    java.lang.Comparable

任何帮助将不胜感激,我有点卡住了。

【问题讨论】:

    标签: java sorting hashmap comparator comparable


    【解决方案1】:

    是的,LinkedList 类(以及任何List/Collection 子类)没有实现Comparable 接口,因此您将在运行时收到异常。

    (1) 你最好自己想出与Ts 的比较算法,而不是使用Objects 的错误转换:

    Comparator<List<T>> comparator = (l1, l2) -> l1.size() - l2.size();
    

    (2) 避免原始类型,尽量概括所有代码:

    HashMap sortedHashMap = new LinkedHashMap();
           |
           V
    HashMap<List<T>, T> map = new LinkedHashMap<>();
    

    (3) 将匿名类转化为 lambda 表达式。

    (4) 如果您想按值对地图进行排序 (List&lt;T&gt;),比较器也应该是合适的:

    Comparator<Map<T,List<T>>> c
           |
           V
    Comparator<List<T>> c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 2021-08-09
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多