繁体   English   中英

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

[英]java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable

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

第一件事 -

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

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

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

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

检查此链接

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

这应该说明一切。

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

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

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

如果你想对List<HashMap>进行排序,你需要有一个Comparator来排序..你不能使用自然排序对它进行排序。因为你的HashMap没有实现Comparable接口..

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

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

Collections.sort(List<T>)需要一个Comparable类型的对象T 这意味着任何实现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)

在您的情况下,您尝试对包含HashMapArrayList进行排序,该HashMap不实现Comparable接口。 所以。 代码失败了。

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

对于要排序的东西,它必须实现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)
    {
        ...
    }
}

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

 Comparable or Comparator interface.

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

如果要使用排序,则列表中的对象必须为“可比较”。 否则java会如何排序呢?

HashMap不是可比较的。 您可以扩展HashMap并实现Comparable接口。

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

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上的第一个答案希望它有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM