如何对一个对象进行排序,它实际上是一个数组
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());
我想弄清楚如何检查数组的组件类型是否实现了 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());