有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在以snake形式打印数组时处理ArrayIndexOutofBounds

我需要以蛇的形式打印矩阵。因此,对于该矩阵,输出应为:

我的问题是这段代码会抛出ArrayIndexOutof边界。我该如何处理才能避免这种情况

int[][] mat= {{1,2,3},{4,5,6},{7,8,9}};
        int row=mat.length;
        int col=mat[0].length-1;

        int c=col;
        int r=0;

        while(r < row) {
            for(int j=c;j>=0;j--) {
            //  System.out.print("r: " + r);
            //  System.out.print(" " + mat[r][j]);


            }
            r=r+1;
            for(int j=0;j<=c;j++) {
        //  System.out.print("r: " + r);
            //System.out.print(" " + mat[r][j]);
            }
            r=r+1;


        }

3 2 1 4 5 6 9 8 7


共 (5) 个答案

  1. # 1 楼答案

    我会这样做:

    int[][] mat= {{1,2,3},{4,5,6},{7,8,9}};
    int row=0;
    while(row < mat.length) {
    
       if(row%2 == 0){ //if an even row, go right to left
          int col = mat[0].length - 1;
          while(col >= 0) { System.out.print(mat[row][col]); col--; } 
       }else {
          int col = 0;
          while(col < mat[0].length) { System.out.print(mat[row][col]); col++; } 
       }
       row++;
    }
    

    错误的地方是在循环中增加r,而不是检查它是否仍然小于打印前的长度。 您还可以将此检查添加到代码中,以使其开始工作:

    .
    .
    r=r+1;
    if(r >= row)
       break;
    for(int j=0;j<=c;j++) {
    .
    .
    .
    
  2. # 2 楼答案

    您的代码引发ArrayIndexOutOfBounds异常,因为在第二次迭代时r变为3(r=r+1),并且您尝试访问mat[3][2](即,您正在访问第四行中不可用的值)

    for(int row = 0; row < mat.length; row++){
       if(row%2 == 0)  { 
       // print the elements in reverse order
       }
       else {
       //print the elements as in given matrix
       }
    }
    

    因此,你所有的奇数行(即第1、第3、第5行……)元素将按相反的顺序打印,甚至行的元素也将按给定的矩阵打印

  3. # 3 楼答案

    这里有一个方法。采用行长度以允许不规则数组非常重要

          int[][] mat = { { 1, 2, 3
                }, { 4, 5, 6
                }, { 7, 8, 9, 10, 11
                }, { 12, 13
                }, { 14, 15, 16, 17, 18, 19
                }
    
          };
    
          for (int r = 0; r < mat.length; r++) {
             if (r % 2 == 0) {
                for (int c = mat[r].length - 1; c >= 0; c--) {
                   System.out.print(" " + mat[r][c]);
                }
             }
             else {
                for (int c = 0; c < mat[r].length; c++) {
                   System.out.print(" " + mat[r][c]);
                }
             }
    
          }
    

    注意,如果您想从左向右蛇行,那么将其修改为使用r % 2 == 1。如果要从下往上,请将外部循环更改为从最后一行开始

  4. # 4 楼答案

    我看到第二行写着:

    int row=mat.length;
    

    由于数组索引从0开始,因此应将其更改为:

    int row=mat.length-1;
    

    避免在调用mat[row]时出现异常

  5. # 5 楼答案

    不用初始化这么多变量,只需设置for循环,它首先确定我们是从行的末尾还是开头开始,然后迭代所有整数

            int[][] mat= {{1,2,3},{4,5,6},{7,8,9}};    
            for(int row = 0; row < mat.length; row++){
                if(row%2 == 0){
                    for(int col = mat[row].length -1; col >= 0; col--){
                        System.out.print(mat[row][col] + " ");
                    }                
                }else{
                    for(int col = 0; col < mat[row].length; col++){
                        System.out.print(mat[row][col] + " ");
                    }                
                }
            }