2016-11-07 5 views
0

行列の偶数行インデックスと奇数行インデックスを入れ替えようとしています。偶数行はすべて上にあり、奇数行はすべて下。私はあらかじめ行列を作りました。ここで行列の偶数/奇数行を入れ替えようとしています(Java)

は、行スワッピングのための私のコードです:

int numberOfEvenRowIndices = 0; 
    if(matrix.length%2.0 == 0){ 
     numberOfEvenRowIndices = matrix.length/2 - 1; 
    } 
    else{ 
     numberOfEvenRowIndices = (int) (matrix.length/2.0 - 0.5); 
    } 
    for(int m = 0; m < numberOfEvenRowIndices; m++){ 
     for (int k = 2; k < rows; k++){ 
      if((matrix[k][0]/10)%2 == 0.0){ 
       int firstEvenRow = k; 

       for (int i = 0; i < matrix[firstEvenRow].length; i++){ 
        //store value of first even row index 
        int temp = matrix[firstEvenRow][i]; 
        //swap value of first even row with first odd row 
        matrix[firstEvenRow][i] = matrix[k-1][i]; 
        matrix[k-1][i] = temp;} 
     } 
    } 

    for(int i = 0 ; i < rows ; i++){ 
     for(int j = 0 ; j < columns ; j++){ 
      System.out.printf("%4s", matrix[i][j]); 
     } 
     System.out.println(); 
     } 
    } 

そしてそれは、出力:

0 1 2 3 4 5 6 7 

40 41 42 43 44 45 46 47 

20 21 22 23 24 25 26 27 

60 61 62 63 64 65 66 67 

10 11 12 13 14 15 16 17 

30 31 32 33 34 35 36 37 

50 51 52 53 54 55 56 57 

70 71 72 73 74 75 76 77 

私は上下(順番に行くために行を必要とする:0、20、40、60 、10、30、50、70) 何か助けていただければ幸いです。

+0

サブオーダーASC/DESCもあるはずですか?私は奇妙で、お互いに相対的にソートされるべきであることを意味しますか? – Antoniossss

+0

元の行列は(上から下へ)0,10,20,30,40,50,60 ...など – AlexT

+0

と私はすべての偶数行をプッシュアップする必要がありますので、最初の列のように見える(上から下) 0,20,40,60,10,30,50 – AlexT

答えて

1

は、ここでは、「並べ替え」の2D配列として行列しているだろう終わりList

ArrayList<Integer[]> result = new ArrayList<Integer[]>(); 
    ArrayList<Integer[]> odd = new ArrayList<Integer[]>(); 

    for (int i = 0, s = matrix.length; i < s; i++) { 
     if (i % 2 == 2) { 
      result.add(matrix[i]); 
     } else { 
      odd.add(matrix[i]); 
     } 
    } 
    result.addAll(odd); 
    Integer[][] resultMatrix = result.toArray(new Integer[result.size()][]); 

を使用して1つの解決策です。

0

私は巧妙なアルゴリズムを選ぶが、読みやすい何かを行くだろう。必要なときにも

void evenodd(int[][] matrix) { 

    // New rows: 
    int[] rows = new int[matrix.length]; 
    int rowI = 0; 

    // Even rows: 
    for (int i = 0; i < matrix.length; i += 2) { 
     rows[rowI] = matrix[i]; 
     ++rowI; 
    } 

    // Odd rows: 
    for (int i = 1; i < matrix.length; i += 2) { 
     rows[rowI] = matrix[i]; 
     ++rowI; 
    } 
    System.arraycopy(rows, 0, matrix, 0, matrix.length); 
} 

ダブルスを使用していますが、整数の除算を使用していない:

int evenRows = (matrix.length + 1)/2; 
int oddRows = matrix.length/2; 

そしてもちろん、スワップ行全体を。

また、配列のクラスにはcopyOfメソッドなどがあり便利な場合があります。

関連する問題