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

标签 java arrays random

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

0.0    0.1           length = 2

1.0    1.1    1.2    length = 3

2.0                  length = 1

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

new Float[][] {
    { 0.0, 0.1 },
    { 1.0, 1.1, 1.2 },
    { 2.0 }
};

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

new Float[][] {
    { anyFloat(), anyFloat() },
    { anyFloat(), anyFloat(), anyFloat() },
    { anyFloat() }
};

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

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

现在我的问题是:我们能否为数组实现此目的或将 matrix 转换为数组?

最佳答案

是的,可以做到。

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

float[][] matrix = new float[randSz()][];

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

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

这就是为什么这是可能的。 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 ]

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

matrix_array:
[ null ][ null ][ null ]

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

private static final Random RAND = new Random(new Date().getTime());
private static final int ROW_UPPER_BOUND = 10;
private static final int COL_UPPER_BOUND = 8;

/**
 * @param args
 */
public static void main(String[] args) {
    float[][] matrix;
    int rows = anyRows();
    // Create array of null "pointers".
    matrix = new float[rows][];
    for (int row = 0; row < rows; ++row) {
        // Assign array "pointers" to first dimension of matrix.
        matrix[row] = anyArrayOfFloats();
    }
    System.out.println(matrixToString(matrix));
}

public static int anyRows() {
    return RAND.nextInt(ROW_UPPER_BOUND) + 1;
}

public static float anyFloat() {
    return RAND.nextFloat();
}

public static float[] anyArrayOfFloats() {
    int sz = RAND.nextInt(COL_UPPER_BOUND) + 1;
    float[] arr = new float[sz];
    for (int i = 0; i < sz; ++i) arr[i] = anyFloat();
    return arr;
}

public static String matrixToString(float[][] matrix) {
    StringBuilder builder = new StringBuilder();
    builder.append("[");
    boolean first = true;
    for (float[] fArr: matrix) {
        if (first) {first = false;} else {builder.append(", ");}
        builder.append(Arrays.toString(fArr));
    }
    builder.append("]");
    return builder.toString();
}

关于java - 动态生成具有不同列长的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22553843/

相关文章:

python - Sympy 重新配置随机种子

java - 通用对象的集合。自动类型转换?隐藏类型转换?

java - 在 Java 中增加数组的值

java - 使用泛型 : Instantiating an object of a generic class with parent and child values in generic

javascript - 为数组中的每个名称查找 Meteor 中另一个集合中的一些用户数据

r - 使用R生成具有iid正态随机变量的矩阵

java - xvfb 上来自 Maven 的 Selenium TestSuit

c++ - 如何在方法中返回 C++ 数组指针

c - 如何将数组中的数字更改为符号

c - random() 是什么时候在 C 中引入的?为什么标准 89 不识别它?