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
相关产品推荐
相关产品推荐

