Java - 使用二维数组和构造函数(初学者)

时间:2018-05-27 16:56:59

标签: java arrays cons

这篇文章真的很长,但如果社区可以帮助我,我会很高兴。

这是来自前班级考试的问题。这次我不得不期待一个类似的,我现在卡住了。我是Java及其概念的新手。 测试结果应如下所示:

The result

我立刻遇到了多个问题。我将努力尽可能具体。首先,我将解释这个任务,它给出了无法改变的条件。

任务 创建一个包含2维的数组字段。该领域应该有各种尺寸。除了大小,数组字段应包含以下模式(见图片)。

1。)创建一个构造函数,该构造函数从传入的参数创建一个矩形数组字段,并带有额外的条件。

1.1)如果参数小于5,则应强制该字段显示为5/5字段。

1.2)如果参数大于5,它应该总是显示为n / n数组。

public class Pattern {
 char[][] field;

public Pattern(int n) {
  // Here goes my code for creating the field
}

2。)编写一个填充构造函数的方法。

public void fillArray() {
  // Here goes my code.
}

到目前为止我的方法

public Pattern(int n) {
field = new char[n][n];              
int i, j;

if (field.length < 5) {
    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= 5; j++) {
            // ? what to do with the array here?
        }
        System.out.println();
    }
}


public void fillArray() {
// no fu**ing idea... 
} 


public static void main (String[]args){
    Pattern cross = new Pattern(2);  
    cross.fillArray();
    System.out.println(cross);
}

问题

1。)构造函数中应该返回什么值?

2.。)如何访问方法中的对象并设置for循环,获取预定义的字段大小?我应该使用this吗?

对于如何正确传递数组信息并正确执行这些信息,我感到很遗憾。

4 个答案:

答案 0 :(得分:1)

public class Pattern {

    private final int size;
    private final char[][] field;

    public Pattern(int n) {
        size = Math.max(n, 5);
        field = new char[size][size];
    }

    public void fillArray() {
        for (int row = 0, i = size - 1; row < size; row++, i--) {
            for (int col = 0, j = size - 1; col < size; col++, j--) {
                if (row == col || row == j)
                    field[row][col] = '*';
                else if (col > row)
                    field[row][col] = col < i ? '1' : '2';
                else
                    field[row][col] = col > i ? '3' : '4';
            }
        }
    }

    public void print() {
        for (int row = 0; row < size; row++) {
            for (int col = 0; col < size; col++)
                System.out.print(field[row][col] == '\0' ? ' ' : field[row][col]);
            System.out.println();
        }
    }


    public static void main(String... args) {
        Pattern cross = new Pattern(2);
        cross.fillArray();
        cross.print();
    }

}

答案 1 :(得分:0)

您的问题的答案:

  1. 构造函数不会返回任何内容。

  2. 你不需要使用&#34;这个&#34;因为二维数组是一个可以在类Pattern中的任何地方访问的字段。如果要访问数组的大小,可以使用field.length。

  3. 在填充数组之前,首先应检查n是否小于5(如果是,则应设置为5)。这是在构造函数中完成的。然后你创建数组。

    之后,你有了for循环,你必须弄清楚如何创建模式。这应该在fillArray方法中完成。

答案 2 :(得分:0)

您正在将fillArray中的内容放在构造函数中。构造函数应该是这样的:

public Pattern(int n) {
    if (n < 5) {
        field = new char[5][5];
    } else {
        field = new char[n][n];
    }
}

两个for循环应该在fillArray方法中:

public void fillArray() {
    // you should loop until field.length and field[x].length
    for (int x = 0; x < field.length; x++) {
        for (int y = 0; y < field[x].length; y++) {
            // ...
        }
    }
}

尝试编写自己的如何填充数组的逻辑。

如果你遇到困难,这是我的解决方案:

for (int x = 0 ; x < field.length ; x++) {
    for (int y = 0 ; y < field[x].length ; y++) {
        /*
        The '1' area can be represented by these inequalities:
        x - y < 0
        x + y < array.length - 1
        The '2' area can be represented by these inequalities:
        x - y < 0
        x + y > array.length - 1
        The '3' area can be represented by these inequalities:
        x - y > 0
        x + y > array.length - 1
        The '4' area can be represented by these inequalities:
        x - y > 0
        x + y < array.length - 1
        Everywhere that does not satisfy any of the inequalities are *s
         */
        int xMinusY = x - y;
        int xPlusY = x + y;
        if (xMinusY < 0 && xPlusY < field.length - 1) {
            field[x][y] = '1';
        } else if (xMinusY < 0 && xPlusY > field.length - 1) {
            field[x][y] = '2';
        } else if (xMinusY > 0 && xPlusY > field.length - 1) {
            field[x][y] = '3';
        } else if (xMinusY > 0 && xPlusY < field.length - 1) {
            field[x][y] = '4';
        } else {
            field[x][y] = '*';
        }
    }
}

// ...

// printing the array out:

for (int x = 0 ; x < field.length ; x++) {
    for (int y = 0 ; y < field.length ; y++) {
        System.out.print(field[x][y]);
    }
    System.out.println();
}

答案 3 :(得分:0)

好的,这是解决方案。要获得这种模式首先在纸上绘制,然后只需编写列和行并搜索模式。

你可以通过练习来学习这一点。

构造函数就像一个方法,但没有返回并使用类的名称。 当您实例化该类的新Object时,将始终调用构造函数。

示例:

Pattern p = new Pattern(3);

保留构造函数,以便在创建该类的Object时需要执行的操作。在您的情况下,决定模式的大小。

示例:

public Pattern(int fS) { //fS = fieldSize
  if (fS < 5)
      fS = 5;
  field = new char[fS][fS];
}

然后你有方法,一旦创建了一个Object,你就可以使用他实例中的所有方法。在你的情况下,你将有一个名为“fillArray”的方法。

<强>解决方案:

    public void fillArray() {
    int fS = field.length;
    char c = ' ';
    int len = fS - 1;

    for (int row = 0; row < fS; row++)
        for (int col = 0; col < fS; col++) {
            if (row == col || row + col == len) c = '*';// This will make the asterisc cross
            if (row < col && row < len - col) c = '1'; //This will do the 1 part
            if (row < col && row > len - col) c = '2'; //This will do the 2 part
            if (row > col && row > len - col) c = '3';//This will do the 3 part
            if (row > col && row < len - col) c = '4';//This will do the 4 part

            field[row][col] = c;
        }
}
  

<强>记住:   在这种情况下,在调用方法 fillArray()

之前,您的数组将不会被填充

示例:

Pattern p = new Pattern(7);
p.fillArray();

要打印模式,我建议您使用toString()方法。你需要覆盖它。

如何:

@Override //Important
public String toString() {
    StringBuilder s = new StringBuilder();
    for (char[] row : field) {
        for (char col : row)
            s.append("\t").append(col);
        s.append("\n");
    }
    return s.toString();
}

使用“ @Override ”标记来查看是否有任何写入mehod toString的拼写错误。现在打印您的模式使用:

    Pattern p = new Pattern(7);
    p.fillArray();
    System.out.println(p); //This line
PD:对不起,如果我做了任何语法错误,我的母语不是英语。希望它有所帮助。