Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java矩阵旋转到位_Java_Matrix - Fatal编程技术网

Java矩阵旋转到位

Java矩阵旋转到位,java,matrix,Java,Matrix,我正在尝试用Java创建一个程序,它接受一个NxN矩阵并在适当的位置旋转它。我正在实现一个方法,该方法获取每一列并将其更改为行以实现此目的。我的堆栈是正确的,我的循环也是正确的,因为我已经输出它们以进行检查 Stack<Integer> takeCol = new Stack(); for (int i = 0; i < matrix.length; i++) { //take columns and make them rows (ROTATION METHOD)

我正在尝试用Java创建一个程序,它接受一个NxN矩阵并在适当的位置旋转它。我正在实现一个方法,该方法获取每一列并将其更改为行以实现此目的。我的堆栈是正确的,我的循环也是正确的,因为我已经输出它们以进行检查

Stack<Integer> takeCol = new Stack();

for (int i = 0; i < matrix.length; i++) {

    //take columns and make them rows (ROTATION METHOD)
    for (int j = matrix[i].length - 1; j >= 0; j--) {

        takeCol.push(matrix[j][i]);
    }

    //reverse stack
    Stack<Integer> temp = new Stack();
    while (!takeCol.isEmpty()) {

        temp.push(takeCol.pop());
    }

    //rotate matrix
    for (int j = 0; j < matrix[i].length; j++) {

        matrix[i][j] = temp.pop();
    }
}
轮换后:

4 4 5 3 
1 7 5 4 
8 6 5 5 
2 5 4 3 
完整代码:

公开课Q1_7{

public static void createMatrix(int matrix[][]) {

    for (int i = 0; i < matrix.length; i++) {

        for (int j = 0; j < matrix[i].length; j++) {

            matrix[i][j] = (int)Math.round(Math.random() * 8) + 1;
        }
    }
}

public static void displayMatrix(int matrix[][]) {

    System.out.println("\n\n");

    for (int i = 0; i < matrix.length; i++) {

        for (int j = 0; j < matrix[i].length; j++) {

            System.out.print(matrix[i][j] + " ");
        }
        System.out.println();
    }
    System.out.println("\n\n");
}

public static void rotateMatrix(int matrix[][]) {

    Stack<Integer> takeCol = new Stack();

    for (int i = 0; i < matrix.length; i++) {

        //take columns and make them rows (ROTATION METHOD)
        for (int j = matrix[i].length - 1; j >= 0; j--) {

            takeCol.push(matrix[j][i]);
        }

        //reverse stack
        Stack<Integer> temp = new Stack();
        while (!takeCol.isEmpty()) {

            temp.push(takeCol.pop());
        }

        //rotate matrix
        for (int j = 0; j < matrix[i].length; j++) {

            matrix[i][j] = temp.pop();
        }
    }
    displayMatrix(matrix);
}

public static void main(String args[]) {

    Scanner s = new Scanner(System.in);

    System.out.println("Enter size of matrix to be rotated");
        int matrixSize = s.nextInt();
    //create matrix size of user input
    int matrix[][] = new int [matrixSize][matrixSize];

    createMatrix(matrix);
    displayMatrix(matrix);
    rotateMatrix(matrix);
    s.close();
}
publicstaticvoidcreatematrix(int-matrix[]]{
对于(int i=0;i=0;j--){
takeCol.push(矩阵[j][i]);
}
//反向堆栈
堆栈温度=新堆栈();
而(!takeCol.isEmpty()){
温度推送(takeCol.pop());
}
//旋转矩阵
对于(int j=0;j<矩阵[i]。长度;j++){
矩阵[i][j]=temp.pop();
}
}
显示矩阵(矩阵);
}
公共静态void main(字符串参数[]){
扫描仪s=新的扫描仪(System.in);
System.out.println(“输入要旋转的矩阵的大小”);
int matrixSize=s.nextInt();
//创建用户输入的矩阵大小
int-matrix[][]=新的int[matrixSize][matrixSize];
创建矩阵(矩阵);
显示矩阵(矩阵);
旋转矩阵(矩阵);
s、 close();
}

}

下面是一个相当长的答案-我已经将调试日志添加到了您的程序中,以便更容易了解正在发生的事情。问题是,代码会在值旋转之前覆盖它们,因此在读取前,例如9会被4覆盖。请参阅下面的代码和日志。(还要注意,添加日志有助于调试)

输出为:

3 9 8 2 
5 5 5 1 
4 7 6 4 
4 1 8 2 


pushing num=[1] val=4
pushing num=[2] val=4
pushing num=[3] val=5
pushing num=[4] val=3
pushing temp num=[1] val=3
pushing temp num=[2] val=5
pushing temp num=[3] val=4
pushing temp num=[4] val=4
writing to m[0,0] val=4
writing to m[0,1] val=4    <-------- here: 9 is overridden by 4
writing to m[0,2] val=5
writing to m[0,3] val=3
pushing num=[5] val=1
pushing num=[6] val=7
pushing num=[7] val=5
pushing num=[8] val=4      <<----- here: we want 9 but is has been overridden 
pushing temp num=[5] val=4
pushing temp num=[6] val=5
pushing temp num=[7] val=7
pushing temp num=[8] val=1
writing to m[1,0] val=1
writing to m[1,1] val=7
writing to m[1,2] val=5
writing to m[1,3] val=4
pushing num=[9] val=8
pushing num=[10] val=6
pushing num=[11] val=5
pushing num=[12] val=5
pushing temp num=[9] val=5
pushing temp num=[10] val=5
pushing temp num=[11] val=6
pushing temp num=[12] val=8
writing to m[2,0] val=8
writing to m[2,1] val=6
writing to m[2,2] val=5
writing to m[2,3] val=5
pushing num=[13] val=2
pushing num=[14] val=5
pushing num=[15] val=4
pushing num=[16] val=3
pushing temp num=[13] val=3
pushing temp num=[14] val=4
pushing temp num=[15] val=5
pushing temp num=[16] val=2
writing to m[3,0] val=2
writing to m[3,1] val=5
writing to m[3,2] val=4
writing to m[3,3] val=3
4 4 5 3 
1 7 5 4 
8 6 5 5 
2 5 4 3 
3982
5 5 5 1 
4 7 6 4 
4 1 8 2 
推送num=[1]val=4
推送num=[2]val=4
推送num=[3]val=5
推送num=[4]val=3
推送温度数值=[1]val=3
推送温度数值=[2]val=5
推送温度数值=[3]val=4
推送温度数值=[4]val=4
写入m[0,0]val=4

写入m[0,1]val=4
堆栈是一个有趣的选择(挑战?)。请注意,您可以在不使用任何其他数据结构的情况下就地执行此操作,只需使用二维阵列即可

还请注意,您也可以从转置和y反射原语合成右旋转

   int[][] matrix = {
            {0, 1, 2, 3},
            {4, 5, 6, 7},
            {8, 9, 10, 11},
            {12, 13, 14, 15}
    };

    // ignoring validation steps ...

    // this is the transpose operation
    int n = matrix.length;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            int t = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = t;
        }
    }

    // this is reflection on y-axis.
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n / 2; j++) {
            int t = matrix[i][j];
            matrix[i][j] = matrix[i][n - j - 1];
            matrix[i][n - j - 1] = t;
        }
    }

    for (int[] row : matrix) {
        System.out.println(Arrays.toString(row));
    }
除了组合到构建块之外,如果出现问题,使用具有不同元素的确定性输入也将有助于调试


您可以将两个循环融合为一个,但首先获得一个有效的实现是非常有用的。

@Makoto上传了完整的代码。那么9消失了吗?也许有些值留在堆栈上,或者被其他值覆盖?@Daniele堆栈非常完美。我检查过了。是什么导致它覆盖了它?查看日志,我们看到“写入m[0,1]val=4”,这是代码中某一行的输出。(你能查一下吗?)
package sample;

import java.util.Stack;

public class A {

    void go(int[][] matrix) {

        Stack<Integer> takeCol = new Stack<>();

        int numPushTake=0;
        int numPushTemp=0;

        for (int i = 0; i < matrix.length; i++) {

            //take columns and make them rows (ROTATION METHOD)
            for (int j = matrix[i].length - 1; j >= 0; j--) {

                int val = matrix[j][i];
                System.out.printf("pushing num=[%d] val=%d%n", ++numPushTake, val);
                takeCol.push(val);
            }

            //reverse stack
            Stack<Integer> temp = new Stack();
            while (!takeCol.isEmpty()) {

                int val = takeCol.pop();
                System.out.printf("pushing temp num=[%d] val=%d%n", ++numPushTemp, val);
                temp.push(val);
            }

            //rotate matrix
            for (int j = 0; j < matrix[i].length; j++) {

                int val = temp.pop();
                System.out.printf("writing to m[%d,%d] val=%d%n", i, j, val);
                matrix[i][j] = val;
            }
        }
    }

    void dump(int[][] m) {
        for (int i=0;i<m.length;i++) {
            for (int j=0;j<m[i].length;j++)
                System.out.print(m[i][j]+" ");
            System.out.println("");
        }           
    }

    public static void main(String[] args) {
        A o = new A();
        int[][] matrix = {
                {3, 9, 8, 2 },
                {5, 5, 5, 1 },
                {4, 7, 6, 4 },
                {4, 1, 8, 2 }
        };
        o.dump(matrix);
        System.out.println("\n");
        o.go(matrix);
        o.dump(matrix);
    }
}
   int[][] matrix = {
            {0, 1, 2, 3},
            {4, 5, 6, 7},
            {8, 9, 10, 11},
            {12, 13, 14, 15}
    };

    // ignoring validation steps ...

    // this is the transpose operation
    int n = matrix.length;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            int t = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = t;
        }
    }

    // this is reflection on y-axis.
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n / 2; j++) {
            int t = matrix[i][j];
            matrix[i][j] = matrix[i][n - j - 1];
            matrix[i][n - j - 1] = t;
        }
    }

    for (int[] row : matrix) {
        System.out.println(Arrays.toString(row));
    }
[12, 8, 4, 0]
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]