【问题标题】:Cannot understand Array bounds [duplicate]无法理解数组边界 [重复]
【发布时间】:2018-08-03 13:26:37
【问题描述】:

我最近一直在学习编码,但不幸的是,我无法遍历数组并理解它们的 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 它会起作用。

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

【问题讨论】:

  • numbers 数组的索引范围从 0 到 5。在 println 语句中,我们在它给出的循环的第一次迭代中将 5(这是数组的长度 - 1)添加到 'i'数组的最后一个元素。在循环的第二次迭代中,将 5 添加到 i(现在为 1)等于 6,但您的数组中没有足够的值来获取该值。这给出了出界异常。 Java中数组下标从0开始
  • 为什么你有一个'count'变量?只需打印出 i 并将其作为循环的第一行,也许这将有助于使一些事情变得清晰
  • 作为学习编码的一部分,一旦您熟悉了您最喜欢的 IDE 中的调试器,这将非常有帮助
  • @PraneethGudumasu 对,我现在明白了。我本质上是结合了 i 的值和数组的长度,但整个事情实际上是我想要检索的索引。所以在循环的第一次迭代中 i = 0 + numbers.length - 3 即 6 - 3 = 3。结果是 3,如“给我索引 3 处的内容”,在我的例子中是数字 4 .
  • @Stultuske 最初的事情是让用户输入我想要排序的数字并打印最大的三个。在对数组的输入进行硬编码并发布后,我忘记删除计数了,抱歉。

标签: java arrays indexoutofboundsexception


【解决方案1】:

数组就像一个对象链。如果你知道它的索引,你总是可以访问这些对象中的任何一个。因此,如果您有一个长度为 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。因此,如果您想调用任何算术来计算索引,请注意您只有很少的有效值。

【讨论】:

  • 很好的解释!当我第一次学习时,我的教授在 Excel 电子表格的上下文中教我们有关数组的知识。单个数组是从 A[0] 开始的列,经过 A[n]... 一旦他向我解释它,它就点击了。也许这也适用于其他人。
  • 自从我从高中开始接受教育并且我们曾经在 pascal/C 上编写代码以来,我总是将数组可视化为矩阵。在这种情况下,矩阵只有一行...
【解决方案2】:

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

所以对于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

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

【讨论】:

    【解决方案3】:

    试图运行

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

    打印出来:

    5 6 7

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-08-12
        • 2022-08-02
        • 1970-01-01
        • 2013-03-11
        • 2015-06-26
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 2014-03-23
        相关资源
        最近更新 更多