繁体   English   中英

从数组创建二维矩阵(java)

[英]Creating a 2d matrix from an array (java)

我应该编写一个从数组中创建二维矩阵的方法,例如:({1,2,3,4},3)应该返回矩阵{{1,2,3},{4}}

public class Matrix {
  public static int[][]toM(int[] array, int a) {
    int[][]matrix = new int [(array.length + a- 1)/ a][a];
    for (int i = 0; i < array.length; i++){
      int value = array[i];
      value = value++;
      for (int row = 0; row < (array.length + a- 1)/a; row++) {
        for (int col = 0; col < a; col++) {
          matrix[row][col]= value++;
        }
      } 
    }
    return matrix;
  }
}

a是每行中元素的数量。 如果我的输入是int [] array = {1,2,3,4}和int n = 3,我该如何得到[[1,2,3],[4]]? 我得到[[4,5,6],[7,8,9]]?

您的代码有点太偏离以至于无法轻松修复。 对于初学者来说,完全没有三级嵌套循环; 另外,你不是通过编写value++获取数组元素(也许你会对使用*ptr++走一个数组的C约定感到困惑)。 从第一原则重新开始。

我假设这是家庭作业,所以我不打算为你写。 但这是基本的大纲。 结果元素的数量取决于输入数组而不是输出矩阵的维数,因此您的算法应该循环输入元素。 对于每一个元素,它的索引一些基本的数学, i将它所属(告诉你, rowcol )的输出矩阵。 array[i]赋值给matrix[row][col]

对于奖励积分,请注意最后一行通常比其他行短。 分配matrix = new int [...][a]将产生[[1, 2, 3], [4, 0, 0]]而不是规定的要求。 通过仅分配外部数组数组 - matrix = new int [...][] - 并分别分配每个子数组来修复此问题,使用模数运算创建最后一行的特殊情况。

我觉得这样的东西更具可读性:

static int[][] transform(int[] arr, int N) {
    int M = (arr.length + N - 1) / N;
    int[][] mat = new int[M][];
    int start = 0;
    for (int r = 0; r < M; r++) {
        int L = Math.min(N, arr.length - start);
        mat[r] = java.util.Arrays.copyOfRange(arr, start, start + L);
        start += L;
    }
    return mat;
}

您得到的矩阵将是MxN ,最后一行可能更少。 它使用Arrays.copyOfRange而不是手动分配和复制行,并使用一些数学来计算出M (这个矩阵有多少行?)和L (这行上有多少个元素?)

    System.out.println(Arrays.deepToString(
        transform(new int[] {1,2,3,4,5,6}, 4)
    )); // prints "[[1, 2, 3, 4], [5, 6]]"

我认为以下内容更接近您的想法:

public static int[][] toM2(int[] array, int a) {
    int[][] matrix = new int [(array.length + a- 1)/ a][a];
    for (int i = 0; i < array.length; i++) matrix[i/a][i%a] = array[i];
    return matrix;
}

int value = array[i]后跟value++表示您正在考虑像C程序员这样的问题。 array[i]没有给你一个指向值的指针,它只给你一个值。

因此,关键是获取索引并将其转换为行和列引用:

int row = i/a;
int col = i%a;

行仍然存在长度相同的问题。 使用java,您不必同时分配所有行。 实际上,您可以为每一行添加一个新数组。 以下是复杂的,但它的工作原理:

public static int[][] toM3(int[] array, int a) {
    int[][] matrix = new int[(array.length + a - 1) / a][];
    int rowStart = 0;
    for (int i = 0; i < array.length; i++) {
        int row = i/a;
        if (matrix[ row ] == null) {
            matrix[ row ] = new int[ Math.min( a, array.length-rowStart) ];
            rowStart += a;
        }
        matrix[ row ][i % a] = array[i];
    }
    return matrix;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM