You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组与构造函数开发问题(新手求助)

帮你搞定Java二维数组图案问题

别担心,刚接触Java就遇到这种带条件的数组问题,懵圈太正常了!我来一步步帮你梳理清楚,从你的疑问到代码实现都会讲明白。

先解答你的两个疑问

  • 构造函数不需要返回值:Java的构造函数是用来初始化对象的,它本身没有返回类型,连void都不用写。你写的public Pattern(int n)这个格式是完全正确的,不用加任何return语句,只要完成数组的初始化就行。
  • 访问对象成员变量:在类的方法(比如fillArray)里,直接用field就能访问这个成员变量;如果方法里有和field同名的局部变量,才需要用this.field来区分,你现在的场景直接用field就没问题。

构造函数的正确实现

构造函数的核心是根据传入的n确定数组的尺寸:n小于5就用5×5,否则用n×n。咱们先确定实际的数组大小,再初始化二维数组,不用在构造函数里搞循环打印——构造函数只负责创建数组,填充和打印交给其他方法:

public class Pattern {
    char[][] field;

    public Pattern(int n) {
        // 确定数组的实际尺寸
        int size = n < 5 ? 5 : n;
        // 初始化二维数组
        field = new char[size][size];
    }
}

这里用了三元运算符n < 5 ? 5 : n,等价于:

int size;
if (n < 5) {
    size = 5;
} else {
    size = n;
}

这样写更简洁~

fillArray方法实现(填充十字图案)

根据你提到的预期十字图案,逻辑是:找到数组的中间索引,中间行和中间列的位置填充指定字符(比如'X'),其他位置填充'.'。代码如下:

public void fillArray() {
    int size = field.length;
    int mid = size / 2; // 中间索引,比如5×5的数组,mid是2(数组索引从0开始)

    // 遍历每一行
    for (int i = 0; i < size; i++) {
        // 遍历每一列
        for (int j = 0; j < size; j++) {
            // 如果是中间行,或者中间列,填充'X',否则填充'.'
            if (i == mid || j == mid) {
                field[i][j] = 'X';
            } else {
                field[i][j] = '.';
            }
        }
    }
}

这里要注意数组索引是从0开始的,比如5×5的数组,索引是0到4,中间位置就是2,这样就能画出完美的十字啦。

补充:重写toString方法(方便打印结果)

你在main方法里写了System.out.println(cross);,如果不重写toString方法,打印的是对象的哈希值,不是数组内容。所以咱们加一个toString方法,把二维数组转换成可打印的字符串:

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    for (char[] row : field) {
        for (char c : row) {
            sb.append(c).append(" "); // 每个字符加空格,排版更整齐
        }
        sb.append("\n"); // 每行结束换行
    }
    return sb.toString();
}

完整测试代码

把所有部分整合起来,main方法测试一下:

public class Pattern {
    char[][] field;

    public Pattern(int n) {
        int size = n < 5 ? 5 : n;
        field = new char[size][size];
    }

    public void fillArray() {
        int size = field.length;
        int mid = size / 2;

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                field[i][j] = (i == mid || j == mid) ? 'X' : '.';
            }
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (char[] row : field) {
            for (char c : row) {
                sb.append(c).append(" ");
            }
            sb.append("\n");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Pattern cross = new Pattern(2); // 传入2,会创建5×5的数组
        cross.fillArray();
        System.out.println(cross);
    }
}

运行这段代码,就能得到你想要的十字图案啦!

内容的提问来源于stack exchange,提问作者Mel Torment

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:12:55