如何对一个对象进行排序,它实际上是一个数组

How to sort an Object, which is really an array

我想弄清楚如何检查数组的组件类型是否实现了 Comparable,如果是,则对数组进行排序。这是我拥有的:

    if (prop1.getClass().isArray())
    {
        if (!(Array.getLength(prop1) == Array.getLength(prop2)))
            throw new AssertionError(objectName + "." + propertyName + "'s aren't the same length!");

        int len = Array.getLength(prop1);
        if (0 == len)
            return;

        List list1 = Arrays.asList(prop1);
        List list2 = Arrays.asList(prop2);
        // class names of objects in arrays are weird
        String componentClassName = StringUtils.remove(StringUtils.remove(list1.get(0).getClass().getName(), "[L"), ';');
        Class componentClazz = null;
        try
        {
            componentClazz = Class.forName(componentClassName);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        if (Comparable.class.isAssignableFrom(componentClazz))
        {
            Collections.sort(list1);
            Collections.sort(list2);

prop1 是 String 的数组时,第一个排序抛出异常:

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to  java.lang.Comparable

prop1 是类型 Object,所以 Arrays.asList(prop1) returns 一个元素的列表,对象又名数组。然后当您尝试对列表进行排序时,它理所当然地抱怨该元素(实际上是一些东西的数组)不是 Comparable.

关于获取数组元素类型,不能看第一个元素,因为它可能是数组元素类型的子类。只需调用 prop1.getClass().getComponentType().

要对数组进行排序,请调用 Arrays.sort(a) 的 8 个重载之一。调用哪一个取决于组件类型。

如果不允许修改原始数组,请先克隆它。

更新

当我说 "depends on the component type" 时,我的意思是您必须检查类型,并调用正确的版本。选择重载方法的版本是在编译时完成的,因此必须静态完成。 (嗯,再一层反射也是一种选择)

Class<?> compType = prop1.getClass().getComponentType();
if (compType == int.class)
    Arrays.sort((int[])prop1);
else if (compType == float.class)
    Arrays.sort((float[])prop1);
// ... 5 more ...
else if (Comparable.class.isAssignableFrom(compType))
    Arrays.sort((Comparable[])prop1);
else
    throw new UnsupportedOperationException("Cannot sort array of " + compType.getName());