Java - Работа с 2-мерным массивом и конструктором (Beginner) - PullRequest
0 голосов
/ 27 мая 2018

Этот пост будет очень длинным, но я был бы очень рад, если бы сообщество могло мне помочь.

Это вопрос из предыдущего теста.Я должен ожидать подобного в этот раз, и я в настоящее время застрял.Я новичок в Java и ее концепциях.Результат теста должен выглядеть следующим образом:

Результат

У меня сразу несколько проблем.Я постараюсь быть как можно более конкретным.Сначала я объясню задачу, которая дала условия, которые нельзя изменить.

Задача Создать поле массива с 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 голосов
/ 27 мая 2018

Хорошо, так вот решение.Чтобы получить шаблоны такого типа, сначала нарисуйте их на бумаге, а затем просто напишите столбцы и строки и найдите шаблон.

Единственный способ узнать это - на практике.

Конструкторпохож на метод, но не имеет возврата и использует имя класса.Конструктор всегда будет вызываться при создании нового объекта этого класса.

Пример:

Pattern p = new Pattern(3);

Оставьте конструктор для вещей, которые вам нужно будет сделатькогда вы создаете объект этого класса.В вашем случае определите размер вашего паттерна.

Пример:

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

Затем у вас есть методы. После создания объекта вы можете использовать все методы.из его экземпляра.В вашем случае у вас будет метод с именем "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 ", чтобы увидеть, сделали ли вы какие-либоопечатка написания метода toString.Теперь, чтобы напечатать ваш шаблон, используйте:

    Pattern p = new Pattern(7);
    p.fillArray();
    System.out.println(p); //This line

PD: Извините, если я допустил грамматическую ошибку, мой родной язык не английский.Надеюсь, это поможет.

0 голосов
/ 27 мая 2018

Вы помещаете то, что должно быть в 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();
}
0 голосов
/ 27 мая 2018
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();
    }

}
0 голосов
/ 27 мая 2018

Ответы на ваши вопросы:

  1. Конструкторы ничего не возвращают.

  2. Вам не нужно использовать «this», так как2-мерный массив - это поле, к которому можно получить доступ в любом месте класса Pattern.Если вы хотите получить доступ к размеру массива, вы можете использовать field.length.

Прежде чем заполнять массив, вы должны сначала проверить, если n меньше 5 (если оно, он должен быть установлен на 5).Это сделано в конструкторе.Затем вы создаете массив.

После этого у вас есть циклы for, в которых вы должны выяснить, как создать шаблон.Это должно быть сделано в методе fillArray.

...