无法理解数组范围

时间:2018-08-03 13:26:38

标签: java arrays indexoutofboundsexception

我最近一直在学习编码,但是不幸的是,我遍历数组并了解它们的Length属性,并且没有超出范围。

我有以下练习需要在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]);

我在这里想要做的是按升序打印,因为降序打印将是数字[numbers.length-1-i]。在我的示例中,我得到了OutOfBounds。如果我执行i + numbers.length - 3,它会起作用。

有人会这么仁慈地解释原因吗?我知道这是一个愚蠢的问题,但我似乎无法理解。

4 个答案:

答案 0 :(得分:2)

该数组就像一个对象链的图像。如果知道对象的索引,则始终可以访问这些对象中的任何一个。因此,如果您有一个长度为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。因此,如果您想在计算索引时调用任何算术运算,请注意以下事实:该索引只有几个有效值。

答案 1 :(得分:1)

因此,在这种情况下,让我们从数组访问可以具有的最小值和最大值的角度来看一下

因此,对于i(0)的最小值,我们得到i + numbers.length - 1 = 0 + 6 - 1 = 5

对于i的最大值,我们得到3或number.length:

对于3:i + numbers.length - 1 = 3 + 6 - 1 = 8

对于数字。长度,我们得到i + numbers.length - 1 = 6 + 6 - 1 = 12

您需要确保数组要在其间进行迭代的可能值始终会在数组范围内给出一个值(显然不是)

答案 2 :(得分:0)

试图运行

for (int i = 0; i < count; i++) {
    System.out.println(i + numbers.length - 1);
}

它打印:

5 6 7

您的数组有6个项目,索引从0到5。当您尝试获取索引> = 6的项目时,它将引发ArrayIndexOutOfBoundsException

答案 3 :(得分:0)

如果要按降序打印,请使用

System.out.println(numbers[numbers.length - 1 - i])