Как скопировать содержимое набора в двумерный массив в Java?

Идея состоит в том, чтобы иметь двумерный массив NxN, где все элементы (числа от 0 до N*N) находятся в случайных позициях. Для генерации случайных чисел я использовал:

 // Creates a set so we avoid repetition of generated numbers
        Set<Integer> generatedNumbers = new LinkedHashSet<Integer>();
        while (generatedNumbers.size() < numberOfElements){
            Integer next = rng.nextInt(numberOfElements) ;
            generatedNumbers.add(next);
        }

Теперь мне нужно скопировать элементы в двумерный массив. В основном, что-то вроде этого:

   for (Integer number: generatedNumbers){
            // Here I'd like to have: 
           // 1st iteration: board[0][0] = number
          // 2nd iteration: board[0][1] = number
          // ...
          // last iteration: board[3][3] = number
        }

куда:

board = new int[boardSize][boardSize];

с boardSize = 4 для этого конкретного случая. Кстати, если есть лучший способ добиться того же, но с использованием другого метода, я был бы рад его прочитать.

Например, вы знаете, как заполнить 2D-массив всеми единицами?

Untitled123 30.05.2019 05:35

Да. Я бы просто сделал for (int i = 0; i < array.length(); i++) for (int j = 0; j < array.length();j++) array[i][j] = 1;

Miguel Duran Diaz 30.05.2019 05:37

Замените эту 1 вашими случайно сгенерированными числами.

Steephen 30.05.2019 05:42

В будущем я бы предложил подождать более 20 минут, прежде чем принять ответ, чтобы вы могли увидеть все свои варианты, прежде чем выбрать, поскольку я считаю, что мой ответ дает вам реальную реализацию кода вместе с комментариями. Это также дает немного времени тем, кто отвечает, чтобы лучше сформулировать свои ответы, вместо того, чтобы гнаться за временем.

Matthew 30.05.2019 06:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо того, чтобы повторять набор снаружи цикла, подумайте о том, чтобы сделать это в обратном порядке. Что-то в духе

Iterator iter = generatedNumbers.iterator()
for (...) {
     for (...) {
          if (iter.hasNext()) arr[i][j] = iter.next()
          else ...
     }
}

должен ли я изменить способ определения generateNumbers? (Set<Integer> generateNumbers = new LinkedHashSet<Integer>(); ), потому что, когда я пытаюсь сделать то, что вы сказали, я получаю сообщение об ошибке: Required: int, Found: java.lang.object

Miguel Duran Diaz 30.05.2019 05:58

Фиксированный. Достаточно было приведения: (int) iter.next(). Не знаю, зачем мне это было нужно, но теперь моя проблема решена.

Miguel Duran Diaz 30.05.2019 06:23
Ответ принят как подходящий

Если я правильно понял, вы хотите случайным образом распределять числа из коллекции в массив 2d. Вот рабочий код, основанный на том, что вы нам дали, который будет делать именно это:

public static Integer[][] getRandomNumbersArray(int base) 
{
    Random rng = new Random();
    int numberOfElements = base * base;

    // Let's use a list so we access by index
    List<Integer> generatedNumbers = new ArrayList<>();

    for (int i = 0; i < numberOfElements; i++) 
    {
        // Generate our random number
        Integer next = rng.nextInt(numberOfElements) ;

        // Check if the number is already added
        if (!generatedNumbers.contains(next)) {
            generatedNumbers.add(next);
        }
        // Number was a duplicate, redo loop cycle
        else i--;
    }
    // Create our board array here
    Integer[][] array = new Integer[base][base];

    // Index used to access the list
    int i1 = 0;

    for (int i2 = 0; i2 < base; i2++) 
    {
        // Populate board row
        for (int i3 = 0; i3 < base; i3++, i1++) {
            array[i2][i3] = generatedNumbers.get(i1);
        }
    }
    return array;
}

public static void main(String[] args)
{
    Integer[][] array = getRandomNumbersArray(4);

    System.out.println("Here is how our board looks like:");
    for (int i = 0; i < array.length; i++) {
        System.out.println(Arrays.toString(array[i]));
    }
}

Выход

Here is how our board looks like:
[8, 7, 11, 3]
[15, 5, 1, 0]
[2, 9, 10, 12]
[13, 4, 6, 14]

Другие вопросы по теме