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

时间:2015-09-24 23:00:09

标签: java arrays sorting comparable

我试图找出如何检查数组的组件类型是否实现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是一个字符串数组时,第一个排序引发异常:

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

1 个答案:

答案 0 :(得分:3)

prop1是类型Object,因此Arrays.asList(prop1)返回一个元素的列表,对象也就是数组。当您尝试对列表进行排序时,它理所当然地抱怨该元素(实际上是某个数组)不是Comparable

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

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

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

<强>更新

当我说'#34;取决于组件类型&#34;时,我的意思是你必须检查类型,并调用正确的版本。选择重载方法的版本是在编译时完成的,因此必须静态完成。 (好吧,另一层反射是另一种选择)

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());