动态生成具有不同列长度的二维数组

Har*_*ezz 1 java arrays random

出于测试目的,我目前遇到了一种情况,我必须随机创建一个二维数组,其中每行的列长度可能不同。例如,考虑这个例子:

0.0    0.1           length = 2

1.0    1.1    1.2    length = 3

2.0                  length = 1
Run Code Online (Sandbox Code Playgroud)

我知道如何以非随机方式创建这样的数组:

new Float[][] {
    { 0.0, 0.1 },
    { 1.0, 1.1, 1.2 },
    { 2.0 }
};
Run Code Online (Sandbox Code Playgroud)

给定返回随机生成值的方法,随机生成anyFloat()矩阵的每个Float值也很容易:

new Float[][] {
    { anyFloat(), anyFloat() },
    { anyFloat(), anyFloat(), anyFloat() },
    { anyFloat() }
};
Run Code Online (Sandbox Code Playgroud)

但挑战是对数组做这样的事情(我猜这是不可能的,因为我们在创建数组时必须知道所需的内存量):

List<List<Float>> matrix = new ArrayList<List<Float>>();
int rows = anyRows();
for (int row = 0; row < rows; row++) {
    matrix.add(anyListOfFloats());
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:我们可以为数组实现这一点或将其转换matrix为数组吗?

Kri*_*hus 5

是的,这是可以做到的。

诀窍是知道 n 维数组只需要立即初始化其第一维的大小。例如:

float[][] matrix = new float[randSz()][];
Run Code Online (Sandbox Code Playgroud)

然后,您可以在 for 循环中使用指向其他数组的指针填充 n 维数组的第一个维度:

for (int i = 0; i < matrix.length; ++i) {
    matrix[i] = new float[randSz()];
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么这是可能的。Java 中的 n 维数组存储为指向其他数组的指针数组。所以在记忆中你会有这样的东西:

2d_array:
[ arr_pointer_1 ][ arr_pointer_2 ][ arr_pointer_3 ]

arr_pointer_1:
    [ 0.0 ][ 0.1 ]

arr_pointer_2:
    [ 1.0 ][ 1.1 ][ 1.2 ]

arr_pointer_3:
    [ 2.0 ]
Run Code Online (Sandbox Code Playgroud)

请记住,第一维中的指针不需要立即初始化 - 它们可以从空指针开始。

matrix_array:
[ null ][ null ][ null ]
Run Code Online (Sandbox Code Playgroud)

这是一个与您提出问题的格式相匹配的完整示例:

2d_array:
[ arr_pointer_1 ][ arr_pointer_2 ][ arr_pointer_3 ]

arr_pointer_1:
    [ 0.0 ][ 0.1 ]

arr_pointer_2:
    [ 1.0 ][ 1.1 ][ 1.2 ]

arr_pointer_3:
    [ 2.0 ]
Run Code Online (Sandbox Code Playgroud)