在Java中,我如何编写类似于以下的函数,以确定数组是否是一维的? (由于array[i].length
部分已被声明为嵌套数组,编译器因为array
部分而拒绝编译它。)
boolean isOneDimensional(Object[] array)
{
for (int i=0; i<array.length; i++)
if (array[i].length>1) return false;
return true;
}
答案 0 :(得分:4)
您通过 getClass
获取条目的Class
,并通过isArray
询问该类是否为数组类型:
boolean isOneDimensional(Object[] array)
{
// Assuming you want an NPE if `array` is `null`, so not checking
for (int i=0; i<array.length; i++)
if (array[i] != null && array[i].getClass().isArray()) return false;
return true;
}
注意 null
检查,以防万一。
不,我的坏,上面给出了错误的结果:
isOneDimensional(new String[2][])
基本上,有两种我们可以处理的事情:一个真正用Object[]
创建的对象,因此可以是一维或多维的,具体取决于其内容或对象使用Object[]
以外的内容创建,例如我上面的new String[2][]
。
我们可以使用上面的循环版本检测第一个案例;但首先,我们使用array.getClass().getComponentType().getComponentType()
检查第二种情况:
boolean isOneDimensional(Object[] array) {
// Assuming you want an NPE if `array` is `null`, so not checking
if (array.getClass().getComponentType().getComponentType() != null) {
return false;
}
for (int i=0; i<array.length; i++) {
if (array[i] != null && array[i].getClass().isArray()) {
return false;
}
}
return true;
}
我们知道第一个getComponentType
将返回非null
,因为我们正在查找与Object[]
兼容的内容,因此它肯定有一个组件类型。所以我们检查那个类型的组件类型,如果知道它是一个数组类型,我们根本不需要循环。
String[] o1 = new String[2]; // Yes, it's one-dimensional
String[][] o2 = new String[2][]; // No, it isn't
Object[] o3 = new Object[2]; // It may or may not be, depending on contents
Object[] o4 = new Object[2]; // It may or may not be, depending on contents
// This makes `o3` multi-dimensional
o3[0] = new Object[0];
System.out.println(isOneDimensional(o1)); // true
System.out.println(isOneDimensional(o2)); // false
System.out.println(isOneDimensional(o3)); // false
System.out.println(isOneDimensional(o4)); // true