Поскольку вы ищете самый квадратный массив, вы можете использовать цикл, который вы разместили здесь, для построения массива возможных измерений, но начинайте с длины массива 1-го массива, чтобы получить все возможные значения.
В этот момент:
- если у вас есть четное число значений, выбрать 2 значения в центре для наиболее квадратного 2-й массива. У вас все еще есть выбор в отношении того, принимаете ли вы наибольшее измерение или нет.
- если у вас есть нечетное число значений, выберите значение в центре для наиболее квадратного 2-й массива, в 2 размеров равны
Вот как бы я это сделать:
import java.util.ArrayList;
import java.util.Arrays;
public class Sandbox {
public static void main(String[] args) {
int[] array1D = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
//int[] array1D = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
int[][] array2D = to2DArray(array1D);
}
public static int[][] to2DArray(int[] array1D) {
// will contain the possible dimensions for the 2D array
ArrayList<Integer> dims = new ArrayList<>();
for (int i = 1; i <= array1D.length; i++) {
if (array1D.length % i == 0) {
dims.add(i);
}
}
System.out.println(Arrays.toString(dims.toArray(new Integer[dims.size()])));
int nbValues = dims.size();
// use a central value for the most squarish 2D array
int sizeX = dims.get(nbValues/2);
// set up the other dimension
int sizeY;
if (nbValues % 2 == 0) {
// the 1-d array was not special, take the other central value
sizeY = dims.get(nbValues/2 - 1);
} else {
// the 1-d array length was a perfect square, take the same value
sizeY = sizeX;
}
System.out.println("sizeX=" + sizeX + " sizeY=" + sizeY);
// create the array and fill it with data
int[][] array2D = new int[sizeX][sizeY];
copyData(array1D, array2D);
return array2D;
}
public static void copyData(int[] array1D, int[][] array2D) {
// TODO take the data from array1D and copy it into array2D
}
}
Каковы критерии, которые вы используете для определения размеров массива 2d? Почему '2darray [3] [6]' ok, но '2darray [2] [9]' неприемлемо? – Michael0x2a
Если ваш глобальный 1-й массив - это все, что у вас есть, вы не можете выбирать между возможными эквивалентными 2-мерными массивами, если только данные не имеют видимых ограничений. @ Michael0x2a задал правильный вопрос, пожалуйста, объясните нам. ** Вы ищете самый «квадратный» 2-мерный массив? ** – Joffrey
Почему вы получаете данные в качестве массива 1-го уровня в первую очередь? Вы контролируете то, что получаете? – Joffrey