有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多维数组将1D转换为2D java。lang.ArrayIndexOutOfBoundsException

我尝试将1D转换为2D数组,但我一直得到java.lang.ArrayIndexOutOfBoundsException,并且我尝试了在stackoverflow或internet上找到的任何东西,但我不明白为什么会出现这个问题

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) 个答案

  1. # 1 楼答案

    你的正确公式应该是这样的

     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,但列不固定,则二维转换公式应如下所示

        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. # 2 楼答案

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

    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();
            }    
        }
    }
    
  3. # 3 楼答案

    考虑第二个循环 假设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]

    在将一维循环转换为二维循环时,需要定义将其拆分为二维数组的规则。因此,第二个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();
            }
        }
    
  4. # 4 楼答案

    错的是2D数组是4*4,这意味着每个索引将有4个元素,即值。所以总共有16个值,所以需要一个包含16个元素的1D数组,上面的代码才能工作。现在1D数组中只有8个值