是否可以在Java中动态构建多维数组?

假设我们有Java代码:

Object arr = Array.newInstance(Array.class, 5);

那会跑吗?进一步说明,如果我们尝试这样的操作:

Object arr1 = Array.newInstance(Array.class, 2);

Object arr2 = Array.newInstance(String.class, 4);

Object arr3 = Array.newInstance(String.class, 4);

Array.set(arr1, 0, arr2);

Array.set(arr1, 1, arr3);

那么arr1将是一个等效于2D的2D数组:

String[2][4] arr1;

怎么样:如果我们直到运行时才知道该数组的维数怎么办?

编辑:如果这有帮助(我确定会…),我们正在尝试从形式为String的字符串解析未知维度的数组

[value1, value2, ...]

要么

[ [value11, value12, ...] [value21, value22, ...] ...]

等等

Edit2:万一像我这样愚蠢的人尝试使用此垃圾,这是一个至少可以编译并运行的版本。逻辑是否合理完全是另一个问题。

Object arr1 = Array.newInstance(Object.class, x);

Object arr11 = Array.newInstance(Object.class, y);

Object arr12 = Array.newInstance(Object.class, y);

...

Object arr1x = Array.newInstance(Object.class, y);

Array.set(arr1, 0, arr11);

Array.set(arr1, 1, arr12);

...

Array.set(arr1, x-1, arr1x);

等等。它只是一个巨大的嵌套对象数组

回答:

实际上可以在Java中完成。(我必须说我有些惊讶。)

免责声明;除了解决这个问题,我再也不想在其他任何地方看到此代码了。我强烈建议您使用List

import java.lang.reflect.Array;

import java.util.*;

public class Test {

public static int[] tail(int[] arr) {

return Arrays.copyOfRange(arr, 1, arr.length);

}

public static void setValue(Object array, String value, int... indecies) {

if (indecies.length == 1)

((String[]) array)[indecies[0]] = value;

else

setValue(Array.get(array, indecies[0]), value, tail(indecies));

}

public static void fillWithSomeValues(Object array, String v, int... sizes) {

for (int i = 0; i < sizes[0]; i++)

if (sizes.length == 1)

((String[]) array)[i] = v + i;

else

fillWithSomeValues(Array.get(array, i), v + i, tail(sizes));

}

public static void main(String[] args) {

// Randomly choose number of dimensions (1, 2 or 3) at runtime.

Random r = new Random();

int dims = 1 + r.nextInt(3);

// Randomly choose array lengths (1, 2 or 3) at runtime.

int[] sizes = new int[dims];

for (int i = 0; i < sizes.length; i++)

sizes[i] = 1 + r.nextInt(3);

// Create array

System.out.println("Creating array with dimensions / sizes: " +

Arrays.toString(sizes).replaceAll(", ", "]["));

Object multiDimArray = Array.newInstance(String.class, sizes);

// Fill with some

fillWithSomeValues(multiDimArray, "pos ", sizes);

System.out.println(Arrays.deepToString((Object[]) multiDimArray));

}

}

回答:

Creating array with dimensions / sizes: [2][3][2]

[[[pos 000, pos 001], [pos 010, pos 011], [pos 020, pos 021]],

[[pos 100, pos 101], [pos 110, pos 111], [pos 120, pos 121]]]

以上是 是否可以在Java中动态构建多维数组? 的全部内容, 来源链接: utcz.com/qa/415858.html

回到顶部