2014-09-14 2 views
0

У меня есть данные, которые я загружаю в массив, и я бы хотел назначить столбец строки & двухмерного массива, используя просто длину массива.Назначение строки и столбца для двумерного массива с использованием длины массива

Например, если мой массив имеет длину 18, как я могу убедиться, что строка и столбец 2D-массива 2darray[3][6], а также для того, чтобы убедиться, что это не [2][9]?

Я начал очень простой цикл, чтобы найти факторы моей длины массива, но я быстро обнаружил, что это может быть слишком сложно, и там должен быть более простой способ.

Это то, что я сделал:

for(int i = 11; i > 0; i--) { 
    if(18 % i == 0) { 
     System.out.print(i + " "); 
    } 
} 

Выход:

9 6 3 2 1 

Любые идеи?

+3

Каковы критерии, которые вы используете для определения размеров массива 2d? Почему '2darray [3] [6]' ok, но '2darray [2] [9]' неприемлемо? – Michael0x2a

+0

Если ваш глобальный 1-й массив - это все, что у вас есть, вы не можете выбирать между возможными эквивалентными 2-мерными массивами, если только данные не имеют видимых ограничений. @ Michael0x2a задал правильный вопрос, пожалуйста, объясните нам. ** Вы ищете самый «квадратный» 2-мерный массив? ** – Joffrey

+0

Почему вы получаете данные в качестве массива 1-го уровня в первую очередь? Вы контролируете то, что получаете? – Joffrey

ответ

0

Поскольку вы ищете самый квадратный массив, вы можете использовать цикл, который вы разместили здесь, для построения массива возможных измерений, но начинайте с длины массива 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 
    } 
} 
Смежные вопросы