我最近一直在学习代码,但不幸的是,迭代数组和理解数组的长度属性,而不是越界。
我需要在Java中解决以下问题--输入几个数字,解析它们并将它们放入一个数组中,然后得到其中的三个最大数字,然后按降序打印它们。我设法做到了,但我确实需要查找最后一部分,因为我得到了ArrayIndexOutOfBoundsException。我已经硬编码了数组中的值,以便尝试理解它,但我希望在这方面提供一些帮助。
这是我的解决方案:
int[] numbers = {1, 2, 3, 4, 5, 6};
Arrays.sort(numbers);
int count = Math.min(3, numbers.length);
for (int i = 0; i < count; i++) {
System.out.println(numbers[i + numbers.length - 1]);我在这里要做的是按升序打印它们,因为以降序打印它们将是numbersnumbers.length -1- i。在我的示例中,我得到了OutOfBounds。如果我做了i + numbers.length - 3,它就能工作。
有人能解释一下原因吗?我知道这是个愚蠢的问题,但我似乎无法理解。
发布于 2018-08-03 13:37:50
因此,在这个上下文中,让我们从数组访问的最小值和最大值的角度来看它
因此,对于i (0)的最小值,我们得到i + numbers.length - 1 = 0 + 6 - 1 = 5
对于i的最大值,我们要么得到3,要么得到numbers.length:
如为3:i + numbers.length - 1 = 3 + 6 - 1 = 8
在numbers.length的情况下,我们得到i + numbers.length - 1 = 6 + 6 - 1 = 12
您需要确保数组之间迭代的可能值总是会在数组的范围内给出一个值(显然不是这样)。
发布于 2018-08-03 13:38:00
数组类似于对象链的图像。如果知道这些对象的索引,则始终可以访问其中的任何对象。因此,在这种情况下,您有一个长度为9的数组,其中包含前9个正整数,在0到8之间将有有效的索引。
0 1 2 3 4 5 6 7 8
[1][2][3][4][5][6][7][8][9]要打印数组中的值,可以使用:
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}如果您想要向后打印它,那么您应该从它的最后一个索引开始,并减少i,直到它大于或等于数组的起始索引为止:
for (int i = values.length - 1; i >= 0; i--) {
System.out.println(values[i]);
}每当您尝试访问超出有效索引范围的索引时,它将导致IndexOutofboundsException。因此,如果您喜欢在计算索引时调用任何算术,请注意这样一个事实,即您对它只有很少的有效值。
发布于 2018-08-03 13:34:52
试着跑
for (int i = 0; i < count; i++) {
System.out.println(i + numbers.length - 1);
}它打印:
5 6 7
数组有6个项,索引从0到5。当您尝试获取具有索引>=6的项时,它将引发ArrayIndexOutOfBoundsException。
https://stackoverflow.com/questions/51673743
复制相似问题