2

我正在寻找建议,因为运行以下代码时出现错误:

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)
4

5 回答 5

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());
        }
于 2012-05-05T05:56:32.207 回答
1

我确实相信您面临的问题源于您调用Arrays.sort()阵列。

排序将尝试比较对象,但您发布的类型不能。比较两个整数、一个字符串和一个布尔值是否有意义?它们不能被排序,至少在没有自定义比较器的情况下不能。

尝试用 's 替换andString再试一次。BooleanInteger

编辑:粗体,不精确的措辞。对象永远不会被铸造。它们使用 compareTo 函数进行比较。

于 2012-05-05T05:38:38.660 回答
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(" "); 
} 

当然,我认为这是一个理论问题,您的对象应该已经创建并存储在某个变量中。

于 2012-05-05T05:45:13.503 回答
0

您的问题的答案完全在堆栈跟踪中。

Arrays.sort()要求数组中的所有元素都实现Comparable,并调用该compareTo()方法以对数组进行排序。

如果要比较的对象不是另一个 Integer compareTo(),则类中的实现Integer会引发异常。

Arrays.sort()方法不会其他答案所建议的那样尝试“将对象转换为相同的类型”。发生强制转换异常是因为compareTo()ofInteger类型化的,但 from 的调用Arrays.sort()不是类型化的。

于 2012-05-05T05:45:24.107 回答
0

sort(Object[])方法假设数组中的每个对象都实现Comparable,并使用该方法来比较元素。当它尝试比较(例如)第一个和第二个元素时,它会Integer.compareTo(Object)使用String参数进行调用。Integer.compareTo(Object)尝试将参数转换为 a ,Integer并且(自然)失败,给出 a ClassCastException

底线是你(一般来说)不能sort(Object[])Object[]数组上使用,除非:

  • 数组元素非空,
  • 数组元素全部实现Comparable,并且
  • 所有元素的compareTo()方法都可以处理所有其他元素的类型。

在这种情况下,最后一个不正确。的compareTo方法Integer只理解其他Integer实例,compareTo方法String只理解其他String实例。

如果不满足上述任何先决条件,则需要使用该Arrays.sort(Object[], Comparator)方法,并提供Comparator适用于数组中所有元素的 a。


顺便说一句,这说明了为什么混合类型的数组和集合通常是一个坏主意。当您不知道它们的类型将是什么时,处理一堆不同的事情是很尴尬的。

于 2012-05-05T05:47:08.110 回答