判断数组是否为一维的函数

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

或者,重新考虑你的设计决策,数组的维数应该是一个运行时属性。 - Raedwald
@Raedwald 我该怎么做? - Mo Sanei
1个回答

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

感谢T.J. Crowder。现在,如果我只使用第一个条件语句(if (array.getClass().getComponentType().getComponentType() != null) return false;),并完全省略循环,会发生什么?那样行得通吗? - Mo Sanei
1
@MohammadSanei:这取决于您是否希望上面的o3返回false(您需要循环)还是true(您不需要)。 - T.J. Crowder
但是如果数组是一个空的多维数组呢?这个函数将错误地返回 true。 - Reinstate Monica
@ABoschman:如何将多维数组转换为一维数组?按定义,它不可能。但是,如果您的解释不同,请删除第一个检查。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接