用于确定数组是否为一维的函数

时间:2016-09-04 07:39:37

标签: java arrays

在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;
}

1 个答案:

答案 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