簡體   English   中英

按列表值對Java Map進行排序

[英]Sorting Java Map by List values

我需要使用以map和lambda表達式作為參數的排序方法,通過值對地圖進行排序,而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

任何幫助將不勝感激,我有點卡住。

是的, LinkedList類(以及任何List / Collection子類)未實現Comparable接口,因此您將在運行時獲取異常。

(1)您最好用T考慮自己的比較算法,而不是對Object使用不正確的轉換:

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<T> )對映射進行排序,則比較器也應該合適:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM