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

5
我正试图对我的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

你是如何尝试对ArrayList进行排序的?你的列表包含多个HashMaps。你是想根据map的键还是值来进行排序? - radimpe
你为什么在这里使用 HashMap?你应该创建一个适当的对象类来保存名称和ID。 - Louis Wasserman
12个回答

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)

列表(List)包含(contain)的元素类型必须实现Comparable接口。

这就是为什么会出现“java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable”异常。


3

2
这样,您就可以实现一个排序地图。
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上的第一个答案,希望能有所帮助!


1

当然,编译器错误试图以最好的方式向您传达它无法比较列表中包含的HashMaps

首先,您应该将列表声明为泛型列表,如下所示:

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

如果你想对 List<HashMap> 进行排序,你需要一个 Comparator 来进行排序。你不能使用自然排序来进行排序,因为你的 HashMap 没有实现 Comparable 接口。
只有当两个实例是可比较的时,你才能进行比较。
*编辑:嗯,我认为你需要两个 Comparators。一个用于你的 List,另一个用于你的 List 中的 HashMap。但我不太确定它是否会起作用。

1

Collections.sort(List<T>)需要一个类型为Comparable的对象T。这意味着任何实现了Comparable接口的对象都可以使用。请参考[此链接](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)

在您的情况下,您正在尝试对包含HashMap的ArrayList进行排序,而HashMap没有实现Comparable接口。 因此,代码会失败。

1

如果要对某些东西进行排序,它必须实现Comparable接口,而这是HashMap所没有的。

因此,当您尝试对HashMap列表进行排序时,您的代码会失败。

如果您真的需要比较HashMaps,您可以创建自己的HashMap,例如:

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

1

是的,因为 java.util.Collections.sort(arList); arList 包含了 HashMap hashList = new HashMap();, 不幸的是 hashMap 没有实现 Comparable 或 Comparator 接口。Collections.sort() 方法将根据实现进行排序。

 Comparable or Comparator interface.

1
首先,你的代码看起来很奇怪,你在每次循环迭代中都将一个新创建的HashMap对象添加到列表中。无论如何,我不会讨论它。也许你应该像这样指定你的ArrayList:ArrayList<HashMap> 但这还不够。如果你有一个特定类型的列表并想要对它们进行排序,那么你的类型(在这种情况下是HashMap)应该实现Comparable接口。HashMap没有实现Comparable接口。请阅读API:http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html 我猜你应该实现自己的比较器作为解决方案。

1

请检查此链接

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

这应该就说清楚了。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接