首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同列长二维阵列的动态生成

不同列长二维阵列的动态生成
EN

Stack Overflow用户
提问于 2014-03-21 08:38:21
回答 2查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
0.0    0.1           length = 2

1.0    1.1    1.2    length = 3

2.0                  length = 1

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

代码语言:javascript
复制
new Float[][] {
    { 0.0, 0.1 },
    { 1.0, 1.1, 1.2 },
    { 2.0 }
};

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

代码语言:javascript
复制
new Float[][] {
    { anyFloat(), anyFloat() },
    { anyFloat(), anyFloat(), anyFloat() },
    { anyFloat() }
};

但现在的挑战是对数组执行这样的操作(我想这是不可能的,因为在创建数组时,我们必须知道所需内存的数量):

代码语言:javascript
复制
List<List<Float>> matrix = new ArrayList<List<Float>>();
int rows = anyRows();
for (int row = 0; row < rows; row++) {
    matrix.add(anyListOfFloats());
}

现在我的问题是:对于数组,我们可以实现这一点,还是可以将matrix转换成数组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-21 09:51:11

是的,是可以做到的。

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

代码语言:javascript
复制
float[][] matrix = new float[randSz()][];

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

代码语言:javascript
复制
for (int i = 0; i < matrix.length; ++i) {
    matrix[i] = new float[randSz()];
}

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

代码语言:javascript
复制
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 ]

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

代码语言:javascript
复制
matrix_array:
[ null ][ null ][ null ]

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

代码语言:javascript
复制
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();
}
票数 4
EN

Stack Overflow用户

发布于 2014-03-21 08:43:12

由于您指出的原因,数组是不可能的。但是,确实有可能将矩阵列表转换为数组。

为此,您可以使用List.toArray(T[])。您必须在表示行的列表和行列表(这是您的矩阵)上使用它。

我还没有对此进行测试,但它应该可以做到:

代码语言:javascript
复制
public MyType[][] matrixToArray(List<List<MyType>> matrix) {
    List<MyType[]> tempRowsList = new LinkedList<>();
    for (List<MyType> row : matrix) {
        tempRowsList.add(row.toArray(new MyType[row.size()]));
    }
    return tempRowsList.toArray(new MyType[tempRowsList.size()][]);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22553843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档