我正在尝试对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
答案 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上的第一个答案希望它有所帮助!