Заполнить двумерный массив выборочно

433
04 февраля 2017, 08:25

Создаю игру Bingo:

private final int BOARD_SIZE = 5;
private int[][] field = new int[BOARD_SIZE][BOARD_SIZE];

Нужно заполнить первую колонку числами в диапазоне 1-15, вторую 16-30, третью 31-45, четвертую 46-60, пятую 61-75.

public void initArray() {//метод Math.random
    field[0][0] = StartNums.makeNums(1, 15);
    field[0][1] = StartNums.makeNums(1, 15);
    field[0][2] = StartNums.makeNums(1, 15);
    field[0][3] = StartNums.makeNums(1, 15);
    field[0][4] = StartNums.makeNums(1, 15);
}

и т.д.

Был ещё вариант сделать 5 одномерных массивов, но подозреваю, что это плохой подход.
Как красиво заполнить каждый из пяти подмассивов? В дальнейшем ещё придется в каждом расставить по возрастанию и исключить повторы, но с этим, думаю, справлюсь.

Answer 1

Можно создавать массив со значениями от минимального до максимального, после чего его перемешивать и брать первые BOARD_SIZE значений. Затем эти значения сортировать и записывать в столбцы:

public class Bingo
{
    private static final int
            BOARD_SIZE = 5,
            OPTIONS_COUNT = 15;
    private static final Random rand = new Random();
    private int[][] field = new int[BOARD_SIZE][BOARD_SIZE];
    public void init()
    {
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            int[] numbers = createAndShuffleArray(OPTIONS_COUNT * i + 1, OPTIONS_COUNT * (i + 1));
            int[] requiredNumbers = new int[BOARD_SIZE];
            System.arraycopy(numbers, 0, requiredNumbers, 0, BOARD_SIZE);
            Arrays.sort(requiredNumbers);
            for (int j = 0; j < BOARD_SIZE; j++)
            {
                field[j][i] = requiredNumbers[j];
            }
        }
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            System.out.println(Arrays.toString(field[i]));
        }
    }
    private int[] createAndShuffleArray(int min, int max)
    {
        int[] array = new int[max - min + 1];
        for (int i = 0; i < array.length; i++)
        {
            int j = rand.nextInt(i + 1);
            array[i] = array[j];
            array[j] = min + i;
        }
        return array;
    }
}

И запуск этого кода:

public static void main(String[] args)
{
    Bingo bingo = new Bingo();
    bingo.init();
}

Числа получаются в рамках диапазона, без повторений и по возрастанию.

Если числа нужно записывать в строку, то цикл будет ощутимо короче:

for (int i = 0; i < BOARD_SIZE; i++)
{
    int[] numbers = createAndShuffleArray(OPTIONS_COUNT * i + 1, OPTIONS_COUNT * (i + 1));
    System.arraycopy(numbers, 0, field[i], 0, BOARD_SIZE);
    Arrays.sort(field[i]);
}
Answer 2

Предлагаю самый очевидный вариант:

for (int i=0; i<BOARD_SIZE; i++) {
    field[0][i] = StartNums.makeNums(1, 15);
}
for (int i=0; i<BOARD_SIZE; i++) {
    field[1][i] = StartNums.makeNums(16, 30);
}
// и так далее

Либо такой:

for (int i=0; i<BOARD_SIZE; i++) {
    for (int j=0; j<BOARD_SIZE; j++) {
        switch (i) {
            case 0:
                field[i][j] = StartNums.makeNums(1, 15);
                break;
            case 1:
                field[i][j] = StartNums.makeNums(16, 30);
                break;
            // и так далее
        }
    }
}

Я бы выбрал первый способ, так как он хорошо читается.

PS. Только Вы определитесь, что Вы заполняете значениями из одного интервала: колонки или строки, а то Вы пишите, что колонки, однако заполняете строки.

Answer 3

Можно вот так:

int magicNumber = 15;
for (int i = 0; i < field.length; i++)
    for (int j = 0; j < field[i].length; j++)
        field[i][j] = startNums.makeNums(i * magicNumber + 1, (i + 1) * magicNumber);
READ ALSO
С чего начать путь Android разработчика? [требует правки]

С чего начать путь Android разработчика? [требует правки]

Принял решение, определиться с направлениемВыбор пал на мобильную разработку

437
Создание копирующего конструктора

Создание копирующего конструктора

Создаём копию другого прямоугольника (он и передаётся в параметрах):

511
Настройка простого persistence.xml файла

Настройка простого persistence.xml файла

При настройке получаю ошибку , добавил скрин шот !

436
Структура классов в проекте java

Структура классов в проекте java

В Desktop Swing приложении есть класс Item в пакете Data, класс ItemFrame (графическое заполнение и редактирование класса Item) в пакете GUI и класс NetWorker в пакете...

414