在运行时期间使用Java创建n维数组

时间:2013-07-10 07:50:18

标签: java arrays dynamic multidimensional-array

我有一个包含数组的String。例如:

"[[1, 2], [4, 5], [7, 8]]"

现在,我想从中创建一个实际的Java数组。我创建了一个函数来获取维度和一个递归函数来获取数组的每个元素。因此,我创建了每个1-D数组,但我想知道在Java中是否有一种方法可以创建在运行时期间找到的维度数组?维度作为数组返回。例如,对于上面的示例,维度为:

[3, 2]

编辑: 有没有办法从这些信息创建一个实际的数组?维度[3,2]只是一个例子。我也可以[3,2,4,5]。可以在运行时从这些信息生成数组吗?我在编译期间没有这些信息。

有一些问题,我无法评论答案。所以,我在这里编辑。

2 个答案:

答案 0 :(得分:2)

如果您正在进行数字工作,那么您应该使用库。例如,我的开源库Vectorz为多维数组/矩阵(double s)提供了适当的支持。

然后你可以做类似的事情:

INDArray m=Arrayz.parse("[[1, 2], [4, 5], [7, 8]]");

INDArray对象封装了所有的多维度,因此您不必担心一直编写大型嵌套循环,而且它还提供了许多普通Java阵列所没有的其他功能和功能。

答案 1 :(得分:1)

主要问题是您无法直接在代码中引用N维数组。

幸运的是,java有一些肮脏的黑客攻击,让你有办法使用N维数组:

数组就像java中的其他非主要对象一样。

因此你可以:

// Note it's Object o not Object[] o
Object o = new Object [dimensionLengh];

您可以使用递归方法来构建它。

Object createMultyDimArray(int [] dimensionLengths) {
    return createMultyDimArray(dimensionLengths, 0);
}

Object createMultyDimArray(int [] dimensionLengths, int depth) {
    Object [] dimension = new Object[dimensionLengths[depth]];
    if (depth + 1 < dimensionLengths.length) {
        for (int i=0; i < dimensionLengths[depth]; i++) {
            dimension[i] = createMultyDimArray(dimensionLengths, depth+1);
        }
    }
    return dimension;
}

要使用此功能,您需要从Object投射到Object []

Java在数组上是类型安全的,错误可能导致ClassCastException。我建议你也阅读有关如何使用java反射创建数组:http://docs.oracle.com/javase/tutorial/reflect/special/arrayInstance.html