java 如何修复我的2D char数组网格渲染以删除'null'值?

gv8xihay  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(128)

我正在尝试渲染一个网格,特别是一个9行17列的2D字符数组。最左边的列和最上面的行用于显示网格坐标A-H和1-8。
然而,每次我渲染网格时,都会出现这些“null”值。例如:1 2 3 4 5 6 7 8。它们出现在栅格中的每个空间中。
下面是代码部分:

import java.util.List;

public class Renderer {

    private static final char[] COL_LABELS = {'1','2','3','4','5','6','7','8'} ;
    private static final char[] ROW_LABELS = {'A','B','C','D','E','F','G','H'} ;

    private static final char DEFAULT = '·' ;
    private static final char HIT = '◉' ;
    private static final char MISS = '~' ;

    public static final int GRID_WIDTH = 17;
    public static final int GRID_HEIGHT = 9;

    private static int cellCol2GridCol(int cellCol) {
        return 2 + (2 * cellCol);
    }

    private static int cellRow2GridRow(int cellRow) {
        return 1 + cellRow ;
    }

    public static char[][] renderEmptyGrid() {
    char[][] grid = new char[GRID_HEIGHT][GRID_WIDTH];

    // Draw the header row
    for (int cellCol = 0; cellCol < GRID_HEIGHT - 1; cellCol++) {
        int gridCol = cellCol2GridCol(cellCol);
        grid[0][gridCol] = COL_LABELS[cellCol];
    }

    // Draw the header column
    for (int cellRow = 0; cellRow < GRID_HEIGHT - 1; cellRow++) {
        int gridRow = cellRow2GridRow(cellRow);
        grid[gridRow][0] = ROW_LABELS[cellRow];
    }

    // Fill the rest of the grid with the DEFAULT character
    for (int i = 1; i < GRID_HEIGHT; i++) {
        for (int j = 2; j < GRID_WIDTH; j += 2) {
            grid[i][j] = DEFAULT;
        }
    }

    return grid;
}

还有这两个helper方法:
静态cellCol 2GridCol方法,它接受有效的单元格列(即0-7的int)作为输入,并返回2d数组中相应的列索引(即0-7的int)。0-16的整数)。
静态cellRow 2GridRow方法,它接受有效的单元格行(即0-7的整数)作为输入,并返回2D数组中的对应行索引(即,0-8的整数)。
我开始用空格字符填充数组。然后用正确的字符替换一些空格。
我知道我不能直接把1或2这样的数字放到一个char数组中;它将最终打印代码为1或2的ASCII字符,而不是1或2。所以我使用了存储在Renderer.COL_LABELS中的字符。

xuo3flqw

xuo3flqw1#

  • null* 值是因为某些单元格不包含数据。

这里是 grid[0]

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

奇数索引处的值从未被分配 char 值,因此仍然是 null-或者更准确地说,'\u0000'
这是因为你在下面的 * for循环 * 中递增了 2

for (int i = 1; i < GRID_HEIGHT; i++) {
    for (int j = 2; j < GRID_WIDTH; j += 2) {
        grid[i][j] = DEFAULT;
    }
}

我不知道你是否打算有额外的,空的细胞。
您已将 GRID_WIDTH 设置为 17,但列的范围为 18
这是另一种生成相同网格的方法。

char[][] grid = new char[9][9];
grid[0][0] = ' ';
for (int row = 1; row < 9; row++)
    Arrays.fill(grid[row], '·');
for (int cell = 1; cell < 9; cell++)
    grid[0][cell] = Character.forDigit(cell, 10);
for (int row = 1; row < 9; row++)
    grid[row][0] = (char) ('A' + (row - 1));

然后,您可以使用以下命令打印网格。

for (char[] row : grid) {
    for (char cell : row) System.out.printf("%2s", cell);
    System.out.println();
}

输出量

相关问题