将1D转换为2D java.lang.ArrayIndexOutOfBoundsException

时间:2014-05-21 03:12:47

标签: java multidimensional-array

我尝试将1D转换为2D数组,但我一直得到java.lang.ArrayIndexOutOfBoundsException,我已经尝试了在stackoverflow或互联网上找到的任何东西,但我不明白为什么我有这个问题?

public class Arrayto2DArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int[] a = {0,1, 6, 83, 4, 5, 12, 7};
        int[][] b = new int[4][4];

          for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                 b[i][j]=0;
                 System.out.print(b[i][j]);
            }
            System.out.println();
          }   

        System.out.println("--------------------------");


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try{
                b[i][j] = a[i+j*4];
                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(b[i][j]);
            }
                System.out.println();
        }    
    }
}

我知道为什么我会因为这行而得到这个错误

 b[i][j] = a[i+j*4];

但我不能提出比这更好的公式。

4 个答案:

答案 0 :(得分:2)

考虑第二个for循环 让我们说当i = 3且j = 3时 a[i+j*4]评估为数组外的a[15]

当您声明二维数组时,您指定了int[][] b = new int[4][];,这意味着第一个内部for循环for (int j = 0; j < b[i].length; j++)应该导致NullPointerException,因为b[i].length没有预定义的长度。在插入内部for循环之前,您应该定义每个b [i]的大小,如b[i] = new int[somenumber]

关于将1d循环转换为2d,您需要定义将其拆分为2-d数组的规则。因此第二个for循环需要修改

编辑:您修改了代码以使用int [4] [4]数组,这意味着您有16个占位符。您的一维数组只包含8个占位符。这取决于你想如何排序数组,就像它可以

b  0   1   2   3
0  0   1   6   83
1  4   5   12  7
2  0   0   0   0
3  0   0   0   0

或任何其他模式

假设1-d数组的长度为8且2-d数组的总索引为16,则以下是更通用的解决方案:

public static void main(String[] args) {
        // TODO code application logic here
        int[] a = { 0, 1, 6, 83, 4, 5, 12, 7 };
        int[][] b = new int[4][4];

        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                b[i][j] = 0;
                System.out.print(b[i][j] + "\t");
            }
            System.out.println();
        }

        System.out.println("--------------------------");

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try {
                    if ((j + i * 4) < a.length)
                        b[i][j] = a[j + i * 4];
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(b[i][j] + "\t");
            }
            System.out.println();
        }
    }

答案 1 :(得分:0)

你的正确公式应该是。

 int[] a = {0,1, 6, 83, 4, 5, 12, 7};
 int[][] b = new int[4][2];

 int k=0;
 for (int i = 0; i < b.length; i++) { // Column of 2D array
    for (int j = 0; j < b[0].length; j++) { // Row of 2D array
         b[i][j]= a[k++];
         System.out.println(b[i][j]);
    }
 }

修改

对于一般情况,如果您的行固定为4但列不固定,则您的2D转换公式应如下所示。

    int col = a.length / 4;
    int remainder = a.length % 4;
    if (remainder > 0) {
        col = col + 1; // Get the correct column size.
    }
    int[][] b = new int[4][col];
    int k = 0;
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < col; j++) {
            if (k < a.length) {
               b[i][j] = a[k];
               System.out.println(b[i][j]);
            }
            k++;
        }
    }

答案 2 :(得分:0)

你的2D数组是4 * 4是错误的,所以对每个索引来说,都会有4个元素,比如说值。因此总共会有16个值,因此您需要一个包含16个元素的一维数组才能使上述代码正常工作。现在,您的1D数组中只有8个值。

答案 3 :(得分:0)

我认为你的代码应该像这样改变

public class Arrayto2DArray {


    public static void main(String[] args) {
        // TODO code application logic here
        int[] a = {0,1, 6, 83, 4, 5, 12, 7};
        int[][] b = new int[4][2];

          for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                 b[i][j]=0;
                 System.out.print(b[i][j]);
            }
            System.out.println();
          }   

        System.out.println("--------------------------");


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try{

                    b[i][j] = a[i+j*4];
                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 2; j++) {
                System.out.print(b[i][j]+" ");
            }
                System.out.println();
        }    
    }
}