多维数组将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];
但我想不出比这个更好的公式
# 1 楼答案
你的正确公式应该是这样的
编辑:
对于一般情况,如果行固定为4,但列不固定,则二维转换公式应如下所示
# 2 楼答案
我认为你的代码应该这样改变
# 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个占位符。这取决于您希望如何对数组进行排序,就像它可能是那样
或任何其他模式
假设1-d数组的长度为8,2-d数组的总索引为16,则以下是更一般的解决方案:
# 4 楼答案
错的是2D数组是4*4,这意味着每个索引将有4个元素,即值。所以总共有16个值,所以需要一个包含16个元素的1D数组,上面的代码才能工作。现在1D数组中只有8个值