分配行&使用数组长度的列到2D数组

时间:2014-09-14 02:12:49

标签: java arrays multidimensional-array

我有数据,我正在加入一个数组,我想分配行&仅使用数组长度的2D数组的列。

例如,如果我的数组的长度为18,我如何确保2D数组的行和列为2darray[3][6],并确保它不是{{1} }}?

我开始一个非常简单的for循环来找到我的数组长度的因素,但我很快发现这可能太复杂了,应该有一个更简单的方法。

这就是我所做的:

[2][9]

输出:

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于您正在寻找最方形的数组,您可以使用此处发布的循环来构建可能维度的数组,但从1维数组的长度开始以获取所有可能的值。

那时:

  • 如果您有偶数个值,请选择中心的2个值,以获得最方形的2-d数组。您仍然可以选择是否先采用最大尺寸。
  • 如果你有一个奇数个数值,选择最方形的二维数组的中心值,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
    }
}