如何像表格一样打印二维数组

17

我遇到了一个二维数组的问题。我的显示结果是这样的:

1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 . . . etc

我想要的基本上是将其显示为:

1 2 3 4 5 6     7  
8 9 10 11 12 13 14  
15 16 17 18 19 20  
21 22 23 24 ... etc

这是我的代码:

    int twoDm[][]= new int[7][5];
    int i,j,k=1;

        for(i=0;i<7;i++){
            for(j=0;j<5;j++) {
             twoDm[i][j]=k;
                k++;}
        }

        for(i=0;i<7;i++){
            for(j=0;j<5;j++) {
                System.out.print(twoDm[i][j]+" ");
                System.out.print("");}
        }
16个回答

28

如果您不介意逗号和括号,您可以简单地使用:

System.out.println(Arrays.deepToString(twoDm).replace("], ", "]\n"));

4
简单明了,不需要额外的依赖。谢谢! - Steve Chambers

13
public class FormattedTablePrint {

    public static void printRow(int[] row) {
        for (int i : row) {
            System.out.print(i);
            System.out.print("\t");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int twoDm[][]= new int[7][5];
        int i,j,k=1;

        for(i=0;i<7;i++) {
            for(j=0;j<5;j++) {
                twoDm[i][j]=k;
                k++;
            }
        }

        for(int[] row : twoDm) {
            printRow(row);
        }
    }
}

输出

1   2   3   4   5   
6   7   8   9   10  
11  12  13  14  15  
16  17  18  19  20  
21  22  23  24  25  
26  27  28  29  30  
31  32  33  34  35  

当然,你可以像其他答案中提到的那样交换7和5,以每行7个的方式显示。

1
如果第i行第j列的元素比第i+-1行和第j列的元素多很多位数字会发生什么? - codemonkeyliketab
有没有办法使用 printf 打印一个字符串表格,其中包含不同长度的字符串,并且仍然可以使行和列对齐?(例如,数组可能是 {{"bat","stegosaurus","turtle"}, {"horse", "armadillo", "cow"}} - Cardinal System

13

每行结束后需要打印一个新的换行符... System.out.print("\n"),或使用println等。你现在只是什么都没有打印 - System.out.print(""),请用println替换print,或用"\n"替换""


我刚刚进行了替换,现在输出结果是:1 2 3 5 6 7 8等,但它只是垂直的。我想要的是像表格一样的形式。无论如何,感谢您的回复。 - kix
2
他说要在每一行后面放置println(),而不是在每次打印后放置。换句话说,在执行第二个for()循环之后,但在允许第一个循环绕回之前。 - asteri
2
请确保您的println位于正确的作用域中。您的第一个print语句将所有内容连接到同一行,因此您需要确保换行发生在“j”for循环的作用域之外。 - Anthony Neace
顺便问一下,我应该怎样让它先打印1-7,然后是8-14之类的。我真的很难理解这个。 - kix
@kix:你试过我的**答案**了吗? - Siva Charan

11
你可以编写一个方法来打印一个二维数组,代码如下:
//Displays a 2d array in the console, one line per row.
static void printMatrix(int[][] grid) {
    for(int r=0; r<grid.length; r++) {
       for(int c=0; c<grid[r].length; c++)
           System.out.print(grid[r][c] + " ");
       System.out.println();
    }
}

这可能是我需要的。我会尝试一下,稍后在这里发布输出结果。谢谢! - kix

3

更高效、更易于实现的方式,以格式化的方式打印二维数组:

尝试这个方法:

public static void print(int[][] puzzle) {
        for (int[] row : puzzle) {
            for (int elem : row) {
                System.out.printf("%4d", elem);
            }
            System.out.println();
        }
        System.out.println();
    }

样例输出:

   0   1   2   3
   4   5   6   7
   8   9  10  11
  12  13  14  15

3
仅供记录,Java 8 提供了更好的替代方案。
int[][] table = new int[][]{{2,4,5},{6,34,7},{23,57,2}};

System.out.println(Stream.of(table)
    .map(rowParts -> Stream.of(rowParts
    .map(element -> ((Integer)element).toString())
        .collect(Collectors.joining("\t")))
    .collect(Collectors.joining("\n")));

3

除了@djechlin的回答之外,您还应该更改行和列。因为您被认为是7行5列,但实际上您想要的是7列5行。

这样做:


请按如下方式操作:
int twoDm[][]= new int[5][7];

for(i=0;i<5;i++){
    for(j=0;j<7;j++) {
        System.out.print(twoDm[i][j]+" ");
    }
    System.out.println("");
}

@kix:根据你的期望更新了我的答案,包括数组声明。int twoDm[][]= new int[5][7]; - Siva Charan
1
恶意评论者可能在起作用,我认为你的回答没有任何问题。 - ddavison
@Siva Charan - 现在它可以工作了,但仍然只显示在一行中。我想要的是在不使用网格的情况下将其显示在5行中。谢谢! - kix
@sircapsalot - 不是的。我只是声明了一个[7][5]的数组。呵呵,我只是个初学者。 - kix
@Siva charan - 我找到了解决我添加的语句的方法,我加了一个if语句 if (twoDm[i][j]%7==1) - kix
显示剩余2条评论

3
我将发布一个更详细的解决方案,除了代码之外,因为初始错误和随后在评论中展示的错误是这种字符串连接问题中常见的错误。
从最初的问题中,正如@djechlin充分解释的那样,我们看到每行表格完成后需要打印一个新行。 因此,我们需要这个语句:
System.out.println();

然而,在第一条打印语句之后立即打印会得到错误的结果。为什么?
1 
2 
...
n 

这是一个范围问题。请注意,有两个循环是有原因的——一个循环处理行,而另一个循环处理列。你的内部循环,“j”循环,迭代给定“i”的每个数组元素“j”。因此,在j循环结束时,您应该有一行。您可以将这个“j”循环的每个迭代视为构建表格“列”。由于内部循环构建了我们的列,我们不希望在那里打印我们的行——它会为每个元素创建一个新行!
一旦您退出j循环,您需要在移动到下一个“i”迭代之前终止该行。这是处理新行的正确位置,因为它是您的表格行的“范围”,而不是您的表格列。
for(i=0;i<7;i++){
    for(j=0;j<5;j++) {
        System.out.print(twoDm[i][j]+" ");  
    }
    System.out.println();
}

您可以看到,即使通过更改“i”和“j”循环的结束值来更改表格的尺寸,这个新行仍将保持不变。


这段代码也正确吗?for(i=0;i<5;i++){ for(j=0;j<7;j++){ if (twoDm[i][j]%7==1) System.out.print("\n"); System.out.print(twoDm[i][j]+" "); } } - kix
1
@Kix 不完全正确。不过这很容易解决——只需将第二个打印语句移至内部循环中即可。你不能在内部for循环之外调用单个单元格,因为会出现越界异常。在纠正后它将编译通过,但由于输出前会有一行空白,所以看起来会很凌乱。请检查你的循环应该做什么,并重新排列你的代码以获得所需的格式。 - Anthony Neace

1

伊利亚,

很抱歉。

你的代码是可以运行的,但是在数组的行和列方面存在一些问题。

我已经纠正了你的代码,现在它可以正确地工作,你可以试试看。

public static void printMatrix(int size, int row, int[][] matrix) {

    for (int i = 0; i < 7 * matrix[row].length; i++) {
        System.out.print("-");
    }
    System.out.println("-");

    for (int i = 1; i <= matrix[row].length; i++) {
        System.out.printf("| %4d ", matrix[row][i - 1]);
    }
    System.out.println("|");

    if (row == size - 1) {

        // when we reach the last row,
        // print bottom line "---------"

        for (int i = 0; i < 7 * matrix[row].length; i++) {
            System.out.print("-");
        }
        System.out.println("-");

    }
}

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

    int rowsLength = matrix.length;

    for (int k = 0; k < rowsLength; k++) {

        printMatrix(rowsLength, k, matrix);

    }

}

public static void main(String[] args) {

    int[][] matrix = { { 1, 2, 5 }, { 3, 4, 6 }, { 7, 8, 9 }

    };

    length(matrix);

}

输出结果如下:
----------------------
|    1 |    2 |    5 |
----------------------
|    3 |    4 |    6 |
----------------------
|    7 |    8 |    9 |
----------------------

1
你可以创建一个方法将矩阵以表格形式打印出来:
注意:这对于数字位数较多和非方阵的矩阵效果不佳。
    public static void printMatrix(int size,int row,int[][] matrix){

            for(int i = 0;i <  7 * size ;i++){ 
                  System.out.print("-");    
            }
                 System.out.println("-");

            for(int i = 1;i <= matrix[row].length;i++){
               System.out.printf("| %4d ",matrix[row][i - 1]);
             }
               System.out.println("|");


                 if(row == size -  1){

             // when we reach the last row,
             // print bottom line "---------"

                    for(int i = 0;i <  7 * size ;i++){ 
                          System.out.print("-");
                     }
                          System.out.println("-");

                  }
   }

  public static void main(String[] args){

     int[][] matrix = {

              {1,2,3,4},
              {5,6,7,8},
              {9,10,11,12},
              {13,14,15,16}


      };

       // print the elements of each row:

     int rowsLength = matrix.length;

          for(int k = 0; k < rowsLength; k++){

              printMatrix(rowsLength,k,matrix);
          }


  }

输出:
---------------------
|  1 |  2 |  3 |  4 |
---------------------
|  5 |  6 |  7 |  8 |
---------------------
|  9 | 10 | 11 | 12 |
---------------------
| 13 | 14 | 15 | 16 |
---------------------

我在练习循环和数组时创建了这个方法,我更愿意使用: System.out.println(Arrays.deepToString(matrix).replace("], ", "]\n")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接