将 2D int 数组打印到屏幕

时间:2021-03-18 17:59:03

标签: java arrays multidimensional-array

我的代码正在读取 txt 文件,然后将其解析为二维表。

谁知道为什么当我用

打印我的表格时
System.out.println(Arrays.deepToString(tableau));

我看到第一行只包含一堆0

这是我的代码和正在解析的 txt 文件的内容:

014 116 218 313 411 517 615 712 819 022 127 225 324 428 529 623 726
821 031 133 239 335 436 532 637 734 838 045 148 246 349 447 541 642
743 844 057 159 252 356 454 553 651 758 855 063 161 264 362 465 568
669 767 866 079 174 273 371 472 576 678 775 877 086 182 287 388 489
585 684 781 883 098 195 291 397 493 594 696 799 892
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;

class Sudoku {
    public static void main(String[] args) throws IOException {
        try {
            int[][] tableau = new int[10][10];
            Scanner scanner = new Scanner(new File(
                    "C:\\Users\\lidaeg\\java\\sudoku\\partie3.txt"));
            while (scanner.hasNext()) {
                String texte = scanner.next();

                Character ligneID = (texte.charAt(1));
                Integer ligne = Character.getNumericValue(ligneID);

                Character colonneID = (texte.charAt(0));
                Integer colonne = Character.getNumericValue(colonneID);

                Character chiffreID = (texte.charAt(2));
                Integer chiffre = Character.getNumericValue(chiffreID);

                tableau[ligne][colonne] = chiffre;
            }
            System.out.println(Arrays.deepToString(tableau));
        } catch (FileNotFoundException exception) {
            System.out.println(" Fichier introuvable!");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

根据您提供的输入,我假设 ligne 以 1 开头,colonne 以 0 开头。

据我所知,数独有 9x9 字段。因此,您需要使用 9x9 数组:

int[][] tableau = new int[9][9];

数组的索引从 0 开始,最后一个索引是数组的大小 -1。 因为输入文件中的 ligne 是从 1 开始的,所以当你想得到正确的位置时,你需要减少这个数字:

Integer ligne = Character.getNumericValue(ligneID-1);

您得到的“0 组”是数组中整型变量的初始值。在 int[][] tableau = new int[9][9]; 行之后,二维数组中的所有值都是 0。如果不向其写入其他数字,这些 0 将保留。这就是使用 10x10 时输出的原因。

答案 1 :(得分:1)

如果文件按适当的顺序包含正好81个数字,扫描器可能会使用nextInt()方法读取整数值;也可以使用 % 10 完全丢弃列-行前缀。

使用 Stream API 的示例如下所示:

public static int[][] readSudoku(Scanner input) {
    return IntStream.range(0, 9)
                    .mapToObj(i -> IntStream.range(0, 9)
                            .map(j -> input.nextInt() % 10)
                            .toArray()
                    )
                    .toArray(int[][]::new);
}

测试

public static void main(String ... args) throws Exception {
    try (Scanner input = new Scanner(
        // new File("C:\\Users\\lidaeg\\java\\sudoku\\partie3.txt")
        "014 116 218 313 411 517 615 712 819 022 127 225 324 428 529 623 726 821 "
      + "031 133 239 335 436 532 637 734 838 045 148 246 349 447 541 642 743 844 "
      + "057 159 252 356 454 553 651 758 855 063 161 264 362 465 568 669 767 866 "
      + "079 174 273 371 472 576 678 775 877 086 182 287 388 489 585 684 781 883 "
      + "098 195 291 397 493 594 696 799 892"
    )) {
        int[][] sudoku = readSudoku(input);

        Arrays.stream(sudoku).map(Arrays::toString).forEach(System.out::println);
    }
}

输出

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

答案 2 :(得分:0)

您正在阅读数独(或类似的东西),它是一个 9 x 9 的矩阵,即 81 个元素。但是您正在创建一个 10 x 10 的整数数组,其中包含 100 个元素,所有元素一开始都默认为零。如果您不分配或覆盖值,则它们将显示为零。

将代码更改为 9 x 9 矩阵并相应地更新数组分配(数组从零开始)

相关问题