4

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

4

11 回答 11

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 contains( T) 必须扩展 Comparable。

这就是为什么它填充java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable

于 2012-09-26T05:42:20.060 回答
3

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

于 2012-09-26T05:41:44.840 回答
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上的第一个答案,希望对您有所帮助!

于 2018-04-04T06:23:38.920 回答
1

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

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

于 2012-09-26T05:38:35.033 回答
1

检查此链接

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

这应该说明一切。

于 2012-09-26T05:38:53.193 回答
1

当然,编译器错误试图以它无法比较的最佳方式向您传达您在HashMaps列表中的信息..

首先,您应该像这样将您的列表声明为通用列表:-

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

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

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

*编辑:-嗯,我想你需要两个Comparators在这里..一个给你的List,一个给你HashMapList..但我不太确定它是否会工作..

于 2012-09-26T05:39:20.730 回答
1

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

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

于 2012-09-26T05:39:53.100 回答
1

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

于 2012-09-26T05:39:57.160 回答
1

对于要排序的东西,它必须实现Comparable接口,而HashMap没有。

结果,当您尝试对 HashMap 列表进行排序时,您的代码将失败。

如果您真的需要能够比较 HashMap,您可以创建自己的 HashMap,如下所示:

public class MyHashMap<K,V> extends HashMap<K, V> implements Comparable<HashMap<K,V>>
{
    ...
    public int compareTo(HashMap<K,V> comparer)
    {
        ...
    }
}
于 2012-09-26T05:40:49.023 回答
1

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

 Comparable or Comparator interface.
于 2012-09-26T05:47:31.787 回答
0

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

如果要使用排序,列表中的对象必须是 Comparable。否则java将如何对其进行排序?

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

于 2012-09-26T05:42:14.407 回答