我尝试将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];
但我不能提出比这更好的公式。
答案 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();
}
}
}