关于数组概念

时间:2012-05-05 05:34:25

标签: java arrays

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

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)

5 个答案:

答案 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()

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

尝试将StringBoolean替换为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)参数调用StringInteger.compareTo(Object)尝试将参数转换为Integer,并且(自然地)失败,给出ClassCastException

最重要的是,您(一般来说)不能在sort(Object[])数组上使用Object[],除非:

  • 数组元素为非null,
  • 数组元素全部实现Comparable
  • 所有元素&#39; compareTo()方法可以处理所有其他元素的类型。

在这种情况下,最后一次不是真的。 compareTo Integer方法仅了解其他Integer个实例,而compareTo String方法仅了解其他String个实例。

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


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

相关问题