2016-01-18 67 views
2

我试图打印数独像网格。欲望输出为:如何打印2D阵列看起来像网格/矩阵?

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

; 

但随着System.out.println(Arrays.deepToString(easyGrid));我得到类似

[[2, 3, 5, 9, 7, 1, 8, 4, 6], [4, 7, 1, 2, 8, 6, 9, 3, 5], [8, 9, 6, 4, 3, 5, 2, 7, 1], [1, 6, 8, 7, 4, 9, 5, 2, 3], [7, 4, 9, 5, 2, 3, 1, 6, 8], [3, 5, 2, 1, 6, 8, 4, 9, 7], [6, 2, 4, 8, 1, 7, 3, 5, 9], [9, 1, 3, 6, 5, 2, 7, 8, 4], [5, 8, 7, 3, 9, 4, 6, 1, 2]] 

回答

4

一种方式是使用StringJoiner(Java的8+)和String.format的组合,例如

import java.util.StringJoiner; 

public class Test { 

    public static void main(String[] args) { 
     int[][] easyGrid = { 
      {2, 3, 5, 9, 7, 1, 8, 4, 6}, 
      {4, 7, 1, 2, 8, 6, 9, 3, 5}, 
      {8, 9, 6, 4, 3, 5, 2, 7, 1}, 
      {1, 6, 8, 7, 4, 9, 5, 2, 3}, 
      {7, 4, 9, 5, 2, 3, 1, 6, 8}, 
      {3, 5, 2, 1, 6, 8, 4, 9, 7}, 
      {6, 2, 4, 8, 1, 7, 3, 5, 9}, 
      {9, 1, 3, 6, 5, 2, 7, 8, 4}, 
      {5, 8, 7, 3, 9, 4, 6, 1, 2}}; 
     for (int[] row : easyGrid) { 
      StringJoiner sj = new StringJoiner(" | "); 
      for (int col : row) { 
       sj.add(String.format("%02d", col)); 
      } 
      System.out.println(sj.toString()); 
     } 
    } 

} 

哪个输出...

02 | 03 | 05 | 09 | 07 | 01 | 08 | 04 | 06 
04 | 07 | 01 | 02 | 08 | 06 | 09 | 03 | 05 
08 | 09 | 06 | 04 | 03 | 05 | 02 | 07 | 01 
01 | 06 | 08 | 07 | 04 | 09 | 05 | 02 | 03 
07 | 04 | 09 | 05 | 02 | 03 | 01 | 06 | 08 
03 | 05 | 02 | 01 | 06 | 08 | 04 | 09 | 07 
06 | 02 | 04 | 08 | 01 | 07 | 03 | 05 | 09 
09 | 01 | 03 | 06 | 05 | 02 | 07 | 08 | 04 
05 | 08 | 07 | 03 | 09 | 04 | 06 | 01 | 02 

您可以使用这些结果生成一些非常复杂的结果。看看formatted strings更多细节

例如...

import java.util.StringJoiner; 

public class Test { 

    public static void main(String[] args) { 
     int[][] easyGrid = { 
      {2, 3, 5, 9, 7, 1, 8, 4, 6}, 
      {4, 7, 1, 2, 8, 6, 9, 3, 5}, 
      {8, 9, 6, 4, 3, 5, 2, 7, 1}, 
      {1, 6, 8, 7, 4, 9, 5, 2, 3}, 
      {7, 4, 9, 5, 2, 3, 1, 6, 8}, 
      {3, 5, 2, 1, 6, 8, 4, 9, 7}, 
      {6, 2, 4, 8, 1, 7, 3, 5, 9}, 
      {9, 1, 3, 6, 5, 2, 7, 8, 4}, 
      {5, 8, 7, 3, 9, 4, 6, 1, 2}}; 
     String lineSplit = ""; 
     StringJoiner splitJoiner = new StringJoiner("+", "|", "|"); 
     for (int index = 0; index < easyGrid[0].length; index++) { 
      splitJoiner.add(String.format("%4s", "").replace(" ", "-")); 
     } 
     lineSplit = splitJoiner.toString(); 
     for (int[] row : easyGrid) { 
      StringJoiner sj = new StringJoiner(" | ", "| ", " |"); 
      for (int col : row) { 
       sj.add(String.format("%02d", col)); 
      } 
      System.out.println(lineSplit); 
      System.out.println(sj.toString()); 
     } 
     System.out.println(lineSplit); 
    } 

} 

,输出

|----+----+----+----+----+----+----+----+----| 
| 02 | 03 | 05 | 09 | 07 | 01 | 08 | 04 | 06 | 
|----+----+----+----+----+----+----+----+----| 
| 04 | 07 | 01 | 02 | 08 | 06 | 09 | 03 | 05 | 
|----+----+----+----+----+----+----+----+----| 
| 08 | 09 | 06 | 04 | 03 | 05 | 02 | 07 | 01 | 
|----+----+----+----+----+----+----+----+----| 
| 01 | 06 | 08 | 07 | 04 | 09 | 05 | 02 | 03 | 
|----+----+----+----+----+----+----+----+----| 
| 07 | 04 | 09 | 05 | 02 | 03 | 01 | 06 | 08 | 
|----+----+----+----+----+----+----+----+----| 
| 03 | 05 | 02 | 01 | 06 | 08 | 04 | 09 | 07 | 
|----+----+----+----+----+----+----+----+----| 
| 06 | 02 | 04 | 08 | 01 | 07 | 03 | 05 | 09 | 
|----+----+----+----+----+----+----+----+----| 
| 09 | 01 | 03 | 06 | 05 | 02 | 07 | 08 | 04 | 
|----+----+----+----+----+----+----+----+----| 
| 05 | 08 | 07 | 03 | 09 | 04 | 06 | 01 | 02 | 
|----+----+----+----+----+----+----+----+----| 
1

由于http://www.tutorialspoint.com/java/util/arrays_deeptostring.htm说:

的java.util.Arrays.deepToString(对象[] )方法返回一个字符串 表示指定数组的“深层内容”。如果 数组包含其他数组作为元素,则字符串表示 包含其内容等。此方法专为 将多维数组转换为字符串而设计。字符串 表示由包含在 方括号(“[]”)中的数组元素列表组成。相邻元素由 字符“,”(逗号后跟空格)分隔。

解决方案是你必须在2d数组中切割数组,然后连续切割数组中的每个数字。之后,您将打印每个阵列中的所有数字。这正是你所需要的:

import java.util.Arrays; 

public class Test { 
    public static void main(String[] args) { 
     int [][] easyGrid = {{2, 3, 5, 9, 7, 1, 8, 4, 6}, 
       {4, 7, 1, 2, 8, 6, 9, 3, 5}, 
       {8, 9, 6, 4, 3, 5, 2, 7, 1}, 
       {1, 6, 8, 7, 4, 9, 5, 2, 3}, 
       {7, 4, 9, 5, 2, 3, 1, 6, 8}, 
       {3, 5, 2, 1, 6, 8, 4, 9, 7}, 
       {6, 2, 4, 8, 1, 7, 3, 5, 9}, 
       {9, 1, 3, 6, 5, 2, 7, 8, 4}, 
       {5, 8, 7, 3, 9, 4, 6, 1, 2}}; 
     for(int[] arr : easyGrid) { 
      for(int number: arr) { 
       System.out.print(number + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 

结果将是:

enter image description here

1

你不得不使用从Arrays类的印刷方法中的一种想法是正确的。但是,使用Arrays.deepToString()时,您最终得到的是单行输出,这不是您想要的结果。相反,你可以遍历您的二维数组的行,每行使用Arrays.toString()

for (int i=0; i < easyGrid[0].length; ++i) { 
    System.out.println(Arrays.toString(easyGrid[i])); 
} 

输出:

[2, 3, 5, 9, 7, 1, 8, 4, 6] 
[4, 7, 1, 2, 8, 6, 9, 3, 5] 
[8, 9, 6, 4, 3, 5, 2, 7, 1] 
[1, 6, 8, 7, 4, 9, 5, 2, 3] 
[7, 4, 9, 5, 2, 3, 1, 6, 8] 
[3, 5, 2, 1, 6, 8, 4, 9, 7] 
[6, 2, 4, 8, 1, 7, 3, 5, 9] 
[9, 1, 3, 6, 5, 2, 7, 8, 4] 
[5, 8, 7, 3, 9, 4, 6, 1, 2]