java.lang.ClassCastException:java.util.HashMap无法强制转换为java.lang.Comparable

时间:2012-09-26 05:31:57

标签: java sorting arraylist hashmap

我正在尝试对ArrayList进行排序。

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

11 个答案:

答案 0 :(得分:5)

第一件事 -

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

您创建了不必要的第一个实例。

第二件事 -

ArrayList listItems = new ArrayList();

此列表包含列表HashMap和HashMap未实现Comparable。

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 :(得分:3)

为了使用Collections.sort(),实现此接口的对象的列表(和数组)可比较http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

答案 2 :(得分:1)

首先,您的代码看起来很奇怪,您在循环的每次迭代中将新创建的HashMap对象添加到列表中。无论如何,我不会讨论它。也许你应该像这样指定你的ArrayList:ArrayList<HashMap> 但这还不够。如果您有特定类型的列表并想对它们进行排序,那么您的类型(在本例中为HashMap)应该实现Comparable接口。 HashMap不实现Comparable接口。阅读API:http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

我猜你应该实现自己的比较器作为解决方案。

答案 3 :(得分:1)

选中此link

  

列表中的所有元素都必须实现Comparable接口。此外,列表中的所有元素必须是可相互比较的(即,e1.compareTo(e2)不得对列表中的任何元素e1和e2抛出ClassCastException。)

这应该说明一切。

答案 4 :(得分:1)

当然,编译器错误试图以最好的方式传达给你,它无法比较你在列表中的HashMaps ..

首先,您应该将列表声明为通用列表,如下所示: -

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

如果您要对List<HashMap>进行排序,则需要Comparator进行排序..您无法使用自然排序对其进行排序。因为HashMap未实现{{1}接口..

如果它们具有可比性,您只能比较两个实例。

*编辑: - 好吧,我认为这里需要两个Comparable ..一个用于Comparators,一个用于List内的HashMap ..但是我不确定它是否会起作用..

答案 5 :(得分:1)

Collections.sort(List<T>)需要T类型的对象Comparable。这意味着任何实现Comparable接口的对象都可以工作。参考[this]( http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29):

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

在您的情况下,您尝试对包含ArrayList的{​​{1}}进行排序,该HashMap未实现Comparable接口。所以。代码失败了。

答案 6 :(得分:1)

HashMap没有实现Comparable接口(http://docs.oracle.com/javase/6/docs/api/)。据我所知,Collections.sort() - 方法只能对自然值进行排序。但是你可以编写自己的比较器并根据需要对列表进行排序。 Collections.sort() - 方法因此重载

答案 7 :(得分: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)
    {
        ...
    }
}

答案 8 :(得分:1)

是的,因为java.util.Collections.sort(arList); arList 包含HashMap hashList = new HashMap(); 不幸的是hashMap没有实现Comparable or Comparator interface. Collections.sort()方法将对

的实现进行排序
 Comparable or Comparator interface.

答案 9 :(得分:0)

猜猜在Collections.sort()行上发生了错误。

如果要使用sort,列表中的对象必须是Comparable。否则java会如何排序呢?

HashMap不具备可比性。您可以扩展HashMap并实现Comparable接口。

答案 10 :(得分:0)

这样您就可以实现排序地图

public class MapUsingSort {
public static void main(String[] args) {

Map<Integer, String> abc = new HashMap<>();
abc.put(3, "a");
abc.put(6, "b");
abc.put(1, "c");
abc.put(4, "h");
abc.put(10, "k");
abc.put(9, "x");

 // Map is stored in ArrayList
List<Entry<Integer,String>> sortedEntries = new ArrayList<Entry<Integer,String>>(abc.entrySet());


Collections.sort(sortedEntries, new Comparator<Entry<Integer,String>>() {
    @Override
    public int compare(Entry<Integer, String> a, Entry<Integer, String> b) 
    {
        //Sorting is done here make changes as per your need 
        // swap a and b for descending order 

        return a.getKey().compareTo(b.getKey());   
    }
   });

for (Object object : sortedEntries) {

    //print your data in your own way
    System.out.println((Map.Entry)object);
   }
  }
}

有关详细信息,请访问HashMap

*

  

这是我在stackOverflow上的第一个答案希望它有所帮助!