我想传递一个arraylist并将它排序,无论它是什么 我得到的错误:线程中的异常" main" java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Character
ArrayList myArray = new ArrayList();
myArray.add("wayne");
myArray.add("bob");
myArray.add('h');
myArray.add(4);
myArray.add(5.50);
ArrayList sortedArray = Validate.Sort(myArray);
for(Object x: sortedArray)
{
System.out.println(x);
}
public static ArrayList Sort(ArrayList value)
{
Collections.sort(value);
return value;
}
答案 0 :(得分:3)
您的ArrayList
混合了String
和char
个值。因此,当两者试图进行比较时,正在调用String
的{{1}}方法。它的签名为compareTo
,因此它会尝试将compareTo(String,String)
转换为char
。要么放入所有String
,要么写一个自定义比较器来处理这样的混合类型。
答案 1 :(得分:0)
看看比较者:
http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
在您的情况下,compareTo()
可能如下所示:
public int compareTo(Object a, Object b){
if(a == b)
return 0;
if(a==null)
return 1;
if(b==null)
return -1;
return a.toString().compareTo(b.toString);
}
但我认为这会毫无用处。
答案 2 :(得分:0)
我想传递一个arraylist并对它进行排序,无论它是什么
这是什么意思?总排序是二元关系,它满足一些属性(反对称,传递性,总体性)。更容易的是,给定两个元素,您必须确定一个标准,以确定哪个小于/大于另一个。
除非你知道这些元素究竟是什么,否则你不能这样做。如果你想对任何一个数组进行排序,给定对象A和B,你甚至不知道它们的类型,你怎么知道哪个比另一个大呢?
在Java中,您可以使用hashCode,这确实是一个标准,但它几乎没用。如果您想避免重复,可以使用Set
而不是List
。无论如何,如果你真的想根据他们的hashCode对元素进行排序,你可以这样做:
private static final Comparator<Object> hashComparator
= new Comparator<Object>() {
@Override
public int compare(Object a, Object b) {
return System.identityHashCode(a) - System.identityHashCode(b);
}
@Override
public boolean equals(Object obj) {
//this is a static singleton, nothing can be equal to it
return false;
}
};
public static ArrayList Sort(ArrayList value)
{
Collections.sort(value, hashComparator);
return value;
}
编辑:如果您有兴趣对字符串和字符的列表进行排序(或者如果您想根据字符串表示对项目进行排序),那么正确的做法是将所有内容转换为字符串,或使用SortedMap<String, Object>
。否则,您可以执行我之前向您展示的相同内容,但使用更具体的compare
函数,例如:
public int compare(Object a, Object b) {
return a.toString().compareTo(b.toString());
}