用Java实现数组旋转方法

时间:2018-09-23 23:34:36

标签: java

这是我在这里的第一篇文章,因此请原谅任何格式错误等。

所以基本上我很难实现采用给定数组并将其顺时针旋转90度的方法。我们应该使用属性“ imp”来实现所有给定的方法,如下所示:

class Matrix {
int[][] imp;
/* All methods in Matrix are implemented in terms of ’imp’ */
}

这是我到目前为止在方法实现中所拥有的:

/**
 * <p> Rotate the matrix by 90 degrees.
 * <p> The old 1st row becomes the new last column, 
 *     the old 2nd row becomes the new 2nd last column, and so on.
 * <p> Hint: attribute 'imp' should be reassigned to a new matrix. 
 * <p> See TestMatrix class for how this method can be used.
 */
public void rotateClockwise() {
    int rows = imp.length;
    int cols = imp[0].length;
    int[][] m2 = new int[cols][rows];
    int i = 0;
    int j = 0;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            m2[i][rows - 1 - i] = imp[i][j];
        }
    }
    imp = m2;
}

这是用于测试我的方法的测试用例:

@Test
public void test18_RotateClockwise() {
    Matrix m1 = new Matrix(3, 4); 

    int[] nr0 = {1 , 2 , 3 , 4 };
    int[] nr1 = {5 , 6 , 7 , 8 };
    int[] nr2 = {9 , 10, 11, 12};
    m1.setRow(0, nr0);
    m1.setRow(1, nr1);
    m1.setRow(2, nr2);

    int[] nc0 = {9, 10, 11, 12};
    int[] nc1 = {5, 6 , 7 , 8 };
    int[] nc2 = {1, 2 , 3 , 4 }; 

    int[] nr0_ = {12, 11 , 10 , 9 };
    int[] nr1_ = {8 , 7  , 6  , 5 };
    int[] nr2_ = {4 , 3  , 2  , 1 }; 

    m1.rotateClockwise();
    assertArrayEquals(nc0, m1.getColumn(0));
    assertArrayEquals(nc1, m1.getColumn(1));
    assertArrayEquals(nc2, m1.getColumn(2));

    m1.rotateClockwise();
    assertArrayEquals(nr0_, m1.getRow(0));
    assertArrayEquals(nr1_, m1.getRow(1));
    assertArrayEquals(nr2_, m1.getRow(2));
}

我了解测试用例正在尝试做的事情,并且我的代码可以编译并且没有任何异常或错误,但是我得到的输出错误是这样的:

arrays first differed at element [0]; expected:<9> but was:<0>

我假设这意味着我基本上是在旋转一个空数组。我想我的问题是如何将阵列从测试用例放入我的方法中进行旋转?我尝试使用getRow和getColumn方法,但收到一条错误消息,告诉我不能在属性imp上调用这些方法。任何帮助表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

我认为这行是不正确的,因为将值写入的位置也肯定也取决于j

            m2[i][rows - 1 - i] = imp[i][j];

我还没有测试过,但这可能是一个工作版本:

            m2[j][rows - 1 - i] = imp[i][j];

编辑: 为什么j应该是第一个索引而不是i? 内部循环遍历原始矩阵内一行的元素。这些元素应插入到新矩阵的同一列中,但应位于不同的行中。当前元素插入的行的索引应随原始矩阵中该元素的列索引增加而增加。 j代表原始矩阵中的列索引,因此它应代表新的/旋转矩阵中的行索引。

答案 1 :(得分:0)

您是否具有适用于Matrix类的适当构造函数?

对您的提示是要检查Java中的矩阵转置实现。这与您的算法非常相似。

例如:Transpose matrix on java67