对 Object 类型的数组进行排序

问题描述

我需要编写一个方法来对一个对象数组进行排序(合并排序)并具有这个确切的签名:

void mergeSort(Object[] a)

根本不允许使用泛型。

方法将传递一个协变数组,例如: String[]Integer[] 。我现在的问题是我不知道如何访问这些对象的 Comparator 或在没有一个的情况下对它们进行排序。对元素进行排序的算法本身不是问题。

解决方法

我假设该任务旨在向您展示在泛型之前的事情是多么糟糕,因为这正是用于排序数组的 Java

由于任务说“自然排序”,这意味着传递的对象实现了 Comparable 接口,该接口具有 compareTo() 方法。因此,要访问它,您只需将 Object 转换为 Comparable。这正是他们在 Java 1.4.2 文档中所说的:https://www2.cs.duke.edu/csed/java/jdk1.4.2/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

泛型背后的关键思想是,当您尝试将 Cactus 对象传递给 sort() 方法时,它会在编译时失败,而不是在 JVM 运行时在运行时抛出 ClassCastException会尝试将 Cactus 类转换为 Comparable 接口。

,

试试这个。

public static void mergeSort(Object[] array) {
    @SuppressWarnings("unchecked")
    Comparator<Object> comparator = (Comparator<Object>)Comparator.naturalOrder();
    Arrays.sort(array,comparator);  // Or your own sort logic with `comparator`
}

String[] stringArray = {"c","d","b","a","e"};
mergeSort(stringArray);
System.out.println(Arrays.toString(stringArray));

[a,b,c,d,e]


Integer[] integerArray = {5,3,2,4,1};
mergeSort(integerArray);
System.out.println(Arrays.toString(integerArray));

[1,5]


Object[] objectArray = {new Object(),new Object(),new Object()};
mergeSort(objectArray);
System.out.println(Arrays.toString(objectArray));

java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.Comparable...


Object[] mixedArray = {"c",1,3};
mergeSort(mixedArray);
System.out.println(Arrays.toString(mixedArray));

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer...