как инициализировать 5-ти мерный массив?

259
12 декабря 2017, 19:03

Привет! Есть простой массив Object[] arr = new int[50] заполненный некими значениями, также есть другой массив Object[][][][][] fiveDArr, правда он 5-ти мерный, нужно скопировать все значения из первого в 5-ти мерный массив так чтобы было типа:fiveDArr[arr][arr][arr][arr][arr] Пробовал такое:

 for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                for (int n = 0; n < 2; n++) {
                    for (int m = 0; m < 2; m++) {
                        System.arraycopy(arr, 0, fiveDArr[i][j][k][n][m], 0, 50);
                    }
                }
            }
        }
    }

к сожалению словил NullPointerException.

Answer 1

Зачем вам это фиг знает, но пусть будет так:

Object[] objArr = new Object[50]//инициализированный где-то снаружи массив
int incremetObjArr = 0;
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
            for (int n = 0; n < 2; n++) {
                for (int m = 0; m < 2; m++) {
                    fiveDArr[i][j][k][n][m] = objArr[incremetObjArr++];
                }
            }
        }
    }
}

Но судя по всему ваш 5 мерный массив вмещает 2 в 5 степени т.е 32 элемента, а вам надо 50.

Задача оказалась сложнее и лежит в области комбинаторики (все возможно уникальные последовательности объектов из одного массива).

Нашел очень хороший ответ с формулами, примерами и кодом тут рядом комбинаторика на ru.SO.com. Там все подробно описано, повторять тут теорию не буду. Если смогу - дополню кодом, но позже.

Поправьте если не прав, но судя по посту сверху все возможные комбинации 50 объектов == факториалу от 50 == 30414093201713378043612608166064768844377641568960512000000000000

т.е. должно быть 50 вложенных циклов, а не 5. Моему компьютеру удалось уместить 1,5 млн объектов на 256 мб RAM, а число сверху я даже произнести не могу, не то чтобы представить сколько памяти надо =)

Поэкспериментировал на массиве в 5 элементов (5 вложенных циклов). Только собирал не массивы, а строки с указанием индекса элемента и складывал их в Set, чтобы точно исключить повторы. Пришел пока к единственному решению (для человека незнакомого с комбинаторикой напрочь).

По сути в решении используются 5 система счисления, где каждая цифра будет обозначать номер элемента в исходном массиве.

    int arraySize = 5;
    Set<String> set = new HashSet<>();
    for (int y = 0; y <arraySize ; y++) {
        for (int x = 0; x < arraySize; x++) {
            if (y == x) continue; // такие if  в начале каждого цикла, чтобы исключить повторы цифр внутри последовательности
            for (int i = 0; i < arraySize; i++) {
                if (x == i || y == i) continue;
                for (int j = 0; j < arraySize; j++) {
                    if (i == j || x == j || y == j) continue;
                    for (int k = 0; k < arraySize; k++) {
                        if (j == k || i == k || x == k || y == k) continue;
                        String e = "" + x + i + j + k; 
                        set.add(e);
                    }
                }
            }
        }
    }

Полностью этот код с выводом по ссылке Ideone.com.

READ ALSO
Чем отличается List от ArrayList?

Чем отличается List от ArrayList?

Чем отличается List от ArrayListПогуглил, но толком ничего не нашел (как минимум, на русском языке)

277
форма &lt;input type=&ldquo;datetime-local&rdquo;&gt;

форма <input type=“datetime-local”>

Подскажите пожалуйста как можно сделать что б в datetime-local всегда выдавался 24 часовой пояс либо как можно его заменить либо хотя бы изменить...

246
Как вывести результат работы функции в переменную, которую я собираюсь использовать вне этой функции для отображения в html?

Как вывести результат работы функции в переменную, которую я собираюсь использовать вне этой функции для отображения в html?

Доброго времени сутокК сожалению я только новенький в программировании и много не понимаю, но буду очень благодарен за помощь

247