从Java中的多维数组中获取未知数量的维度

shi*_*www 5 java arrays dimensions multidimensional-array

在Java中是否有可能找到具有"先验"未知维数的数组的维数?也就是说,如果一个人不知道多维矩阵的维数,如果可能的话,如何检索它?

tzi*_*ima 9

有没有人知道在Java中是否有可能获得具有'先验'未知维数的数组的维数?也就是说,如果一个人不知道多维矩阵的维数,如果可能的话,如何检索它?

我不确定我是否理解你想要完成的事情.如果您只想知道数组中有多少元素,Anubian的答案是正确的.但我所理解的是,您想要计算给定通用数组的维数.

public class Test {
    public static int getNumberOfDimensions(Class<?> type) {
        if (type.getComponentType() == null) {
            return 0;
        } else {
            return getNumberOfDimensions(type.getComponentType()) + 1;
        }
    }

    public static void main(String[] args) {
        System.out.println(getNumberOfDimensions(int[][][].class)   == 3);
        System.out.println(getNumberOfDimensions(int[][].class)     == 2);
        System.out.println(getNumberOfDimensions(int[][][][].class) == 4);
        System.out.println(getNumberOfDimensions(int.class)         == 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果那不是您要找的东西,我会有一个提示:长度尺寸之间存在差异.


更新:我认为这与我们的要求完全无关,但尼古拉在评论中问我:

这很好用,但是如果在运行时定义了维度数(例如用户必须输入所需的维度),那该怎么办呢?如何定义和初始化数组?

解决方案在于一些基于光反射的黑客攻击:

import java.lang.reflect.Array;

public class Test {
    public static Class<?> getArrayType(Class<?> componentType, int dimensions) throws ClassNotFoundException {
        if (dimensions == 0) {
            return componentType;
        }

        String rawName = componentType.getName();
        switch (rawName) {
            case "byte":    rawName = "B"; break;
            case "char":    rawName = "C"; break;
            case "double":  rawName = "D"; break;
            case "float":   rawName = "F"; break;
            case "int":     rawName = "I"; break;
            case "long":    rawName = "J"; break;
            case "short":   rawName = "S"; break;
            case "boolean": rawName = "Z"; break;
            default:
                rawName = "L" + rawName + ";";
                break;
        }

        for (int i = 0; i < dimensions; i++) {
            rawName = "[" + rawName;
        }

        return Class.forName(rawName);
    }

    public static Object createArray(Class<?> componentType, int dimensions, int length) throws NegativeArraySizeException, ClassNotFoundException {
        if (dimensions == 0) {
            return null;
        }

        Object array = Array.newInstance(getArrayType(componentType, dimensions - 1), length);

        for (int i = 0; i < length; i++) {
            Array.set(array, i, createArray(componentType, dimensions - 1, length));
        }

        return array;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Object object = createArray(Integer.class, 3, 10);
        System.out.println(object.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

诀窍是使用给定的组件类型为N维数组构造一个Class.如果我们知道类名如何存储在最低级别,我们就可以做到这一点.其余代码只是一个简单的无趣递归.


Anu*_*oob 1

假设你的矩阵称为 m:

您可以通过运行获取列数

m.length;
Run Code Online (Sandbox Code Playgroud)

对于 Java,多维数组实际上是数组的数组。行数是可变的。假设 i 是 0 之间的整数,m.length-1你可以这样做:

m[i].length;
Run Code Online (Sandbox Code Playgroud)

获取行中元素的数量。