我正在寻找建议,因为我在运行以下代码时遇到错误:
public class Test9 {
public static void main(String[] args) {
Object [] myObjects = {
new Integer(12),
new String("foo"),
new Integer(5),
new Boolean(true)
};
Arrays.sort(myObjects);
for(int i=0; i<myObjects.length; i++) {
System.out.print(myObjects[i].toString());
//System.out.print(" ");
}
}
}
我得到的错误是:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at Practicequestions.Test9.main(Test9.java:18)
答案 0 :(得分:2)
Object [] myObjects = {
new Integer(12),
new String("foo"),
new Integer(5),
new Boolean(true)
};
这是一个泛型类型数组。因此,当您尝试使用public static void sort(Object[] a)
对其进行排序时,它会填充运行时ClassCastException,因为数组包含不可相互比较的元素。
Array.sort()根据元素的自然顺序将指定的对象数组按升序排列。
您可以使用另一种方法sort(Object[] a,Comparator c)
。使用您自己的逻辑实现Comparator并传递它。
Object[] myObjects = { new Integer(12), new String("foo"),
new Integer(5), new Boolean(true) };
Comparator<Object> comparator=new Comparator<Object>() {
@Override
public int compare(Object obj1, Object obj2) {
if(obj1 instanceof String && obj2 instanceof String){
return String.valueOf(obj1).compareTo(String.valueOf(obj2));
}else if(obj1 instanceof Integer && obj2 instanceof Integer){
return ((Integer) obj1).compareTo((Integer) obj2);
}else if(obj1 instanceof Boolean && obj2 instanceof Boolean){
return ((Boolean) obj1).compareTo((Boolean) obj2);
}else if(obj1 instanceof String && obj2 instanceof Integer){
return 1;
}else if(obj1 instanceof Integer && obj2 instanceof String){
return -1;
}else if(obj1 instanceof Boolean){
return -1;
}else if( obj2 instanceof Boolean){
return 1;
}
return 0;
}
};
Arrays.sort(myObjects,comparator);
for (int i = 0; i < myObjects.length; i++) {
System.out.print(myObjects[i].toString());
}
答案 1 :(得分:1)
我相信你所遇到的问题源于你在阵列上调用Arrays.sort()
。
排序将尝试比较对象,但您发布的类型不能。比较两个整数,一个字符串和一个布尔值是否有意义?它们无法排序,至少没有自定义比较器。
尝试将String
和Boolean
替换为Integer
,然后重试。
编辑:用粗体,不精确的措辞。对象永远不会被铸造。它们使用compareTo函数进行比较。
答案 2 :(得分:0)
排序不会将对象自动转换为相同的常见类型。在将对象添加到集合之前,必须将对象转换为字符串。
Object [] myObjects = {
new Integer(12).toString(),
new String("foo"),
new Integer(5).toString(),
new Boolean(true).toString()
};
Arrays.sort(myObjects);
for(int i=0; i<myObjects.length; i++) {
System.out.print(myObjects[i].toString());
//System.out.print(" ");
}
当然我认为这是一个理论问题,你的对象应该已经创建并存储在一些变量中。
答案 3 :(得分:0)
问题的答案完全在堆栈跟踪中。
Arrays.sort()
要求数组中的所有元素都实现Comparable
,并调用compareTo()
方法以对数组进行排序。
如果要比较的对象是而不是另一个整数,compareTo()
类中Integer
的实现会引发异常。
Arrays.sort()
方法 NOT 尝试“将对象转换为相同类型”,这与其他答案所建议的相同。出现强制转换异常是因为compareTo()
的{{1}}是类型的,但Integer
的调用不是类型的。
答案 4 :(得分:0)
sort(Object[])
方法假设数组中的每个对象都实现Comparable
,并使用该方法来比较元素。当它尝试比较(例如)第一个和第二个元素时,它会使用Integer.compareTo(Object)
参数调用String
。 Integer.compareTo(Object)
尝试将参数转换为Integer
,并且(自然地)失败,给出ClassCastException
。
最重要的是,您(一般来说)不能在sort(Object[])
数组上使用Object[]
,除非:
Comparable
和compareTo()
方法可以处理所有其他元素的类型。在这种情况下,最后一次不是真的。 compareTo
Integer
方法仅了解其他Integer
个实例,而compareTo
String
方法仅了解其他String
个实例。
如果不满足上述任何前提条件,则需要使用Arrays.sort(Object[], Comparator)
方法,并提供适用于数组中所有元素的Comparator
。
顺便说一下,这说明了为什么混合类型的数组和集合通常是个坏主意。当你不知道他们的类型将会是什么时,处理一堆不同的事情是很尴尬的。