2010-04-24 177 views
3

我應該編寫一個從數組創建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

回答

3

你的代碼有點偏離基礎,很容易修復。對於初學者來說,三層嵌套循環是完全不必要的。另外,你不要通過編寫value++來獲取數組元素(也許你會對使用*ptr++來行走數組的C約定感到困惑)。從第一原則開始。

我假設這是家庭作業,所以我不打算只爲你寫。但這是基本的概要。結果元素的數量取決於輸入數組而不是輸出矩陣的維數,所以您的算法應該循環輸入元素。對於每個元素,其索引i上的一些基本數學運算將會告訴您它在輸出矩陣中的屬性(rowcol)。將array[i]分配給matrix[row][col]

要獲得獎勵積分,請注意最後一行通常比其他行短。分配matrix = new int [...][a]將生成[[1, 2, 3], [4, 0, 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; 
} 
1

我覺得這樣的事情是一個很大的可讀性:

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