2012-09-26 37 views
2

我試圖對我的ArrayList進行排序。java.lang.ClassCastException:java.util.HashMap不能轉換爲java.lang.Comparable

java.util.ArrayList arList= new java.util.ArrayList(); 
    arList=getList();  
    java.util.Collections.sort(arList); 

哪裏我的GetList()函數這裏

public ArrayList getList() throws Exception 
{ 
ArrayList listItems = new ArrayList(); 
//Query executing here..............! 
      while (rs.next()) 
       { 
       HashMap hashList = new HashMap(); 
       hashList.put("name",rs.getString(1)); 
       hashList.put("id",rs.getBigDecimal(2)); 
       listItems.add(hashList); 
       } 
      return listItems; 
} 

但我面對錯誤:java.lang.ClassCastException:java.util.HashMap中不能轉換爲java.lang.Comparable的

+0

究竟你是如何排序'ArrayList'?你的列表包含許多'HashMaps'。您是否嘗試根據地圖的關鍵字或地圖的值對它進行排序? – radimpe

+0

爲什麼你在這裏使用'HashMap'?您應該創建一個適當的對象類來存放名稱和ID。 –

回答

5

第一件事 -

java.util.ArrayList arList= new java.util.ArrayList(); 
arList=getList();  

您創建的第一個實例是不必要的。

第二件事 -

ArrayList listItems = new ArrayList(); 

這個列表包含列表HashMap和HashMap中沒有實現可比。

java.util.Collections.sort(arList); 

public static <T extends Comparable<? super T>> void sort(List<T> list) 

列表包含(T)必須擴展Comparable。

這就是爲什麼它填充java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable

1

首先,你的代碼看起來很奇怪,你在循環的每次迭代中都將新創建的HashMap對象添加到列表中。無論如何,我不會討論它。也許你應該這樣指定你的ArrayList:ArrayList<HashMap> 但這還不夠。如果你有一個特定類型的列表並想對它們進行排序,那麼你的類型(在這種情況下是HashMap)應該實現Comparable接口。 HashMap不執行Comparable接口。閱讀API:http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

你應該實現自己的比較作爲一個解決方案,我猜。

1

入住這link

列表中的所有元素都必須實現Comparable接口。此外,列表中的所有元素必須相互可比(即,e1.compareTo(e2)不得爲列表中的任何元素e1和e2拋出ClassCastException)。

這應該說明一切。

1

當然編譯器錯誤是試圖傳達你可以預期,它不能比較HashMaps的最佳途徑,你有你的列表裏面..

首先,你應該聲明您的列表作爲通用的清單如下: -

List<HashMap<String, String>> hashList = new ArrayList<>(); 

如果要排序List<HashMap>,你需要有一個Comparator排序。您可以使用自然順序..不排序呢?因爲你的HashMap沒有實現Comparable接口..

只能比較兩種情況,如果它們具有相近..

*編輯: - 好吧,我想你會需要兩個Comparators這裏..一個給List,一個用於HashMapList內。但我我不太確定它是否會起作用..

1

HashMap沒有實現Comparable接口(http://docs.oracle.com/javase/6/docs/api/)。據我所知,Collections.sort() - 方法只能對自然值進行排序。但是您可以編寫自己的比較器並根據需要對列表進行排序。 Collections.sort() - 方法因此過載

1

對於需要排序的東西,它必須實現Comparable接口,這是HashMap不接受的東西。

因此,當您嘗試對您的HashMaps列表進行排序時,您的代碼將失敗。

如果你真正需要的是能夠比較HashMaps這樣,你可以創建自己的HashMap,像這樣:

public class MyHashMap<K,V> extends HashMap<K, V> implements Comparable<HashMap<K,V>> 
{ 
    ... 
    public int compareTo(HashMap<K,V> comparer) 
    { 
     ... 
    } 
} 
0

猜測發生在行Collections.sort()上的錯誤。

如果要使用排序,則列表中的對象必須是Comparable。否則,java會如何排序呢?

HashMap不可比。您可以擴展HashMap並實現Comparable接口。

1

是的,因爲java.util.Collections.sort(arList); arList包含HashMap hashList = new HashMap(); 不幸的HashMap沒有落實Comparable or Comparator interface.Collections.sort()方法排序的

實施
Comparable or Comparator interface. 
相關問題