我正在尝试编写一个代码来查找2D数组的平均值:
这就是我写的:
public class AverageLength
{
public static void main(String[] args)
{
int sum = 0;
int w = 0;
int[][] foobar = new int[][]
{
{0, 5, 7},
{3, 2, 4},
{8, 7, 3},
{1, 5, 3}
};
for (int i = 0; i < foobar.length; i++)
{
for (int j = 0; j <foobar[0].length; j++)
{
System.out.println(foobar[i][j]);
sum = sum + foobar[i][j];
w++;
}
} System.out.println("Average = " + sum/w);
}
}
但是,如果我更改数组长度并尝试以下内容:
int[][] foobar = new int[][]
{
{0, 5, 7, 3},
{3, 3, 5, 7, 8, 4},
{8, 3},
{1, 5, 1, 2, 3}
};
它给了我以下错误:
线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:2 在AverageLength.main(AverageLength.java:18)
如何解决此问题?
答案 0 :(得分:1)
更改
foobar[0].length
到
foobar[i].length
当你的子数组长度不同时,你应该得到相应的长度
例如
{0, 5, 7, 3},
{3, 3, 5, 7, 8, 4},
{8, 3},
在这种情况下
当你遍历第三个子数组foobar[0].length
时, {8, 3}
是4。
当你尝试访问第二个索引[第三个元素]时会出现错误
ArrayIndexOutOfBoundsException: 2
因为没有第二个索引。
以及第二个子数组{3, 3, 5, 7, 8, 4},
中的值8和4将不会打印,因为您循环了4次。
答案 1 :(得分:0)
当您在数秒长度内检查数组长度时,您应该使用i而不是0,因为如果使用0,您将始终获得第一个数组的长度。
for (int j = 0; j <foobar[i].length; j++)
答案 2 :(得分:0)
使用foobar[0].length
,您使用每个内部数组的第一个内部数组的长度。请改用foobar[i].length
,这将计算当前数组的长度。
顺便说一句:从Java8开始,计算int数组的平均值可以在java内部完成。如何使用Java8的流API 来解决此任务的示例:
import java.util.Arrays;
public class AverageLength
{
public static void main(String[] args)
{
int[][] foobar = new int[][]
{
{0, 5, 7},
{3, 2, 4},
{8, 7, 3},
{1, 5, 3}
};
System.out.print("Average = ");
System.out.println(
// convert 2D array to stream of arrays
Arrays.stream(foobar)
// flatten 2D array to 1D array
.flatMapToInt(Arrays::stream)
// let java calculate the average
.average()
// get result
.getAsDouble());
}
}
优点:
.parallel()
)