从数组创建2d矩阵(java)

问题描述:

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

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]]?

+0

.. 。你的问题是? – 2010-04-24 23:41:43

+0

这看起来不像我遇到过的任何2D矩阵。 – duffymo 2010-04-24 23:52:16

+0

这是功课吗? 我不认为你已经完全明确了这个问题。 将数组转换为给定宽度的部分矩阵,从左上角开始填充,然后再下降? – penguat 2010-04-24 23:59:34

你的代码有点偏离基础,很容易修复。对于初学者来说,三层嵌套循环是完全不必要的。另外,你不要通过编写value++来获取数组元素(也许你会对使用*ptr++来行走数组的C约定感到困惑)。从第一原则开始。

我假设这是家庭作业,所以我不打算只为你写。但这是基本的概要。结果元素的数量取决于输入数组而不是输出矩阵的维数,所以您的算法应该循环输入元素。对于每个元素,其索引i上的一些基本数学运算将会告诉您它在输出矩阵中的属性(rowcol)。将array[i]分配给matrix[row][col]

要获得奖励积分,请注意最后一行通常比其他行短。分配matrix = new int [...][a]将生成[[1, 2, 3], [4, 0, 0]]而不是所述的要求。通过分配数组的外部阵列来解决这个问题,并且分别分配每个子数组,使用模数算法做出最后一行的特例。

我认为下面是更接近你心目中是什么:

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; 
} 

其次value++线int value = array[i]表明您正在考虑像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; 
} 

我觉得这样的事情是一个很大的可读性:

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]]"