如何打印2D数组看起来像网格/矩阵?

时间:2016-01-18 02:50:16

标签: java arrays sudoku

我正在尝试像网格一样打印Sudoku。欲望输出将是:

    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]]

3 个答案:

答案 0 :(得分:5)

一种方法可能是使用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 :(得分:1)

因为在http://www.tutorialspoint.com/java/util/arrays_deeptostring.htm中说:

  

java.util.Arrays.deepToString(Object [])方法返回一个字符串   表达深层内容&#34;指定的数组。如果   array包含其他数组作为元素,字符串表示   包含其内容等。此方法专为   将多维数组转换为字符串。字符串   表示由数组元素的列表组成,包含在中   方括号(&#34; []&#34;)。相邻的元素由   字符&#34;,&#34; (逗号后跟空格)。

解决方案是您必须在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

答案 2 :(得分: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]