试图在矩阵中交换偶数/奇数行(Java)

时间:2016-11-07 19:12:54

标签: java matrix

我正在尝试在矩阵中交换偶数和奇数行索引,以便所有偶数行都在顶部,所有奇数行都在底部。我事先创建了矩阵。

这是我的行交换代码:

    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) 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

以下是使用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()][]);

最后你将“排序”矩阵作为2d数组。

答案 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;

当然要交换整行。

类Arrays也有copyOf方法,这可能会派上用场。