2014-04-27 152 views
3

我一直想知道如何從左下角對角地包裝一個字符串到矩陣中。 例如:Java對角矩陣

String str = "123456789"; 

//Output matrix: 
// 479 
// 258 
// 136 

//Or if str = "123456789123456"; 

//Output would be: 

// 2 
// 73 
// 484 
// 2595 
// 13616 

這是我到目前爲止有:

 int index = 0; 
    for(int i = 0; i < matrix.length; i++) 
    { 
     for(int k = matrix.length - 1; k > -1; k--) 
     { 
      if(index == word.length()) 
       break; 
      matrix[k][i] = "" + str.charAt(index); 
      index++; 
     } 
    } 
+0

你能解釋一下,你是如何編寫輸出矩陣的,我沒有得到你想要如何根據你的輸入字符串得到輸出矩陣.. –

+1

什麼是'單詞'? – azurefrog

回答

0

這是合理有效的實施,我認爲這是比較容易理解的。

這段代碼在連續的對角線上循環,噹噹前位置在矩陣內時,它將從字符串中分配下一個字符。

在下面的圖表中,問號位置在對角線上,但它們不在矩陣內。這些問號位置的輸入字符串中沒有字符。

Diagonal Matrix 
    4  ? 
    3  ?? 
    2  479 
    1  258? 
    0  136?? 

環路經過升序排列行,但分配給每一行反轉,因爲你的矩陣是從索引陣列的普通Java的方式來看待時,倒置完成:matrix[size - row - 1],而不是matrix[row]

這種方式沒有必要在對角線的上方和下方進行特殊處理。

public static void main(String[] args) throws Exception { 
    String str = "123456789"; 
    int size = 3; 

    int[][] matrix = new int[size][size]; 
    { 
     int index = 0; 
     for (int diagonal = 0; diagonal < size * 2 - 1; diagonal++) { 
      int row = diagonal; 
      int column = 0; 
      while (row >= 0) { 
       if (row < size && column < size) { 
        matrix[size - row - 1][column] = Character.getNumericValue(str.charAt(index++)); 
       } 
       row--; 
       column++; 
      } 
     } 
    } 
} 

它也適用於較大尺寸的矩陣(4×4,5×5等),但你只能編碼值高達字符串中的9 - 如果你想要更高的價值,這是更好地編碼他們在一個逗號分隔字符串並將字符串拆分爲一個字符串數組。

0

不做出關於效率的要求在這裏,但只要它應該工作作爲字符串適合一個方陣:

static char[][] toDiag(String s) 
{ 
    int sideLen = (int) Math.sqrt(s.length()); // assume string fits into 
               // square matrix 
    char[][] m = new char[sideLen][sideLen]; 
    int index = 0; 
    //fill lower-left section of array 
    for (int i = m[0].length - 1; i >= 0; i--) 
    { 
     for (int k = 0; k <= m[0].length-1-i; k++) 
     { 
      m[i+k][k] = s.charAt(index++); 
     } 
    } 
    //fill upper-right section of array 
    for (int i = sideLen%2==1?sideLen/2:sideLen/2 -1; i <= m[0].length; i++) 
    { 
     for (int k = 0; k <= m[0].length-1-i; k++) 
     { 
      m[k][i+k] = s.charAt(index++); 
     } 
    } 
    return m; 
} 
0
public static void main(String[] args) 
{ 
    String inString = "123456789"; 
    int N = (int) Math.sqrt((double) inString.length()); 
    int out[][] = new int[N][N]; 
    int index=0; 

    //fills elements below the diagonal 
    for(int i=0;i<N-1;i++) 
     for(int j=0;j<=i;j++) 
      out[N-1-i+j][j] = Character.getNumericValue(inString.charAt(index++)); 

    //fills the diagonal 
    for(int i=0;i<N;i++) 
     out[i][i] = Character.getNumericValue(inString.charAt(index++)); 

    //fills elements above the diagonal 
    for(int i=N-2;i>=0;i--) 
     for(int j=0;j<=i;j++) 
      out[j][N-1-i+j] = Character.getNumericValue(inString.charAt(index++)); 

    //prints the output 
    for(int i=0;i<N;i++) 
    { 
     for(int j=0;j<N;j++) 
     { 
      System.out.print(out[i][j] + "\t"); 
     } 
     System.out.println(); 
    } 
}