【问题标题】:Creating an n-dimension Array in Java during runtime在运行时在 Java 中创建一个 n 维数组
【发布时间】:2013-07-08 01:24:48
【问题描述】:

我有一个包含数组的字符串。示例:

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

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

[3, 2]

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

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

【问题讨论】:

  • 你对新创建的数组做了什么?
  • 总是有两个维度吗?或者也可以是“[[[1,2],[3,4]][[5,6],[7,8]][[9,10]]?
  • “创建一个我在运行时找到的维度的数组” - 你的意思是创建一个数组而不知道它在编译时的维度吗?即您的输入字符串可能是 3 或 4 维数组?

标签: java arrays dynamic multidimensional-array


【解决方案1】:

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

然后你可以这样做:

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

INDArray 对象封装了所有的多维性,因此您无需一直担心编写大的嵌套循环,而且它提供了许多普通 Java 数组所没有的其他功能和能力。

【讨论】:

  • 不错的链接。如果是的话,您应该声明它是您的库。 (在链接中似乎如此)
【解决方案2】:

主要问题是不能直接在代码中引用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

【讨论】:

  • 这一行出现 StackOverflow 错误:dimension[i] = createMultyDimArray(dimensionLengths, depth);当使用参数new int[]{2,3,4,5} 调用它时
  • 我想你忘了增加深度(你可能想在行中使用 i)
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2012-09-17
相关资源
最近更新 更多