了解-1
循环中的for
,是否需要包含for
和if
行代码的详细说明?
int[] array = { 2, 5, 1, 2, 3, 5 };
Arrays.sort(array);
// why does this start counting from 1, and if l put 0 it goes to error, out of bounds?
for (int i = 1; i < array.length; i++) {
if (array[i] == array[i - 1]) { // - 1?
System.out.print(array[i]);
}
}
答案 0 :(得分:2)
它没有任何内在错误。
它只是使迭代从i=1
开始直到数组的长度,但由于数组中的索引是从零开始的,所以在获取值时必须抵消它。
这就是array[i-1]
如果您放置i=0
,那么您还必须将结束条件更改为array.length-1
,并且您必须按array[i]
访问这些值,以避免超出范围。< / p>
答案 1 :(得分:0)
对于这样的问题,请一次一行地使用代码并尝试按照它正在进行的操作。
这里你要做的第一件事是创建一个数组,然后对它进行排序。 Arrays.sort(array)
电话结束后,您的array
将包含以下内容:
index 0 1 2 3 4 5
----------------------
contents 1 2 2 3 5 5
请记住,数组是零索引的 - 这意味着第一个元素位于索引0处。(数组的内容无关紧要,它是索引你想要注意。)
数组不能索引小于零,并且它们也不能具有大于其长度-1的索引。因此,对于您的示例,这意味着您不能将-1用作索引,因为它小于0.您也不能使用6作为索引,因为6大于数组的长度(6)减去1。
在for循环的初始化中,为第一次迭代设置i
等于1。虽然非常规,但它完全合法。这只是表示我们将从数组中开始的 index 。因此,对于循环的第一次迭代,array[i]
将指向值2,array[i-1]
指向值1.
index 0 1 2 3 4 5
----------------------
contents 1 2 2 3 5 5
i ^
i-1 ^
现在,如果您将i
设置为从索引0开始,该怎么办?那么,array[i]
将指向第0个索引(值1)...但是array[i-1]
指向什么?
index 0 1 2 3 4 5
----------------------
contents 1 2 2 3 5 5
i ^
i-1 ^
它指向索引-1。由于数组的索引不能为-1,因此会导致IndexOutOfBoundsException。希望这是有道理的。