2016-11-19 115 views
2

我需要梳理的地圖使用地圖和lambda表達式作爲參數排序的方法值,而地圖有結構,如:排序的Java地圖由值列表

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 

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

回答

3

是的,LinkedList類(如任何List/Collection子類)沒有實現Comparable接口,所以你會在運行時得到的異常。

(1)你最好想了T真是讓人不是使用不正確的鑄造自己的比較算法與Object S:

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

(2)忌生吃類型,嘗試概括所有代碼:

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

(3)轉動的匿名類成λ表達式。

(4)如果要排序值映射(List<T>),比較也應適量:

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