为什么在 Java 中使用另一个数组值时不能使用数组索引递减?
Why I cannot use array index decrement when using a another array value in Java?
这是Java中插入排序的简单代码。我尝试减少 Java 代码的行数。但是这个问题是做不到的。我想知道为什么做不到。
我试过的代码(错误发生在第9行)
import java.util.Scanner;
public class InsertionSortModified {
public static int[] insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int pos = i;
while (pos > 0 && arr[pos-1] > temp)
arr[pos--] = arr[pos-1];
arr[pos] = temp;
}
return arr;
}
public static void main(String args[]) {
Scanner scnr = new Scanner(System.in);
int elementarr[] = new int[5];
for (int j = 0; j < 5; j++)
elementarr[j] = scnr.nextInt();
elementarr = insertionSort(elementarr);
for (int j = 0; j < elementarr.length; j++)
System.out.print(elementarr[j] + " ");
}
}
命令显示错误window
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at InsertionSortModified.insertionSort(InsertionSortModified.java:9)
at InsertionSortModified.main(InsertionSortModified.java:22)
当代码修改成这样时,程序正在运行。 (第 8 至 11 行)
while (pos > 0 && arr[pos-1] > temp) {
arr[pos] = arr[pos-1];
pos--;
}
为什么我不能使用
arr[pos--] = arr[pos-1];
当你想做的时候
arr[pos--] = arr[pos-1];
并且 pos
的值是 1
然后它将 pos
递减到 0,然后在 pos
的第二次使用中你使它成为 0 - 1
在第 9 行中,您递减计数器的顺序错误。正确的行是
`arr[pos] = arr[--pos];`
此处您将 arr[pos] 中的当前值交换为 arr[pos-1] 中的当前值,因为您在使用它之前减少了计数器。之后,pos值已经在正确的位置插入'temp'值
我找到问题所在了。一步一步执行代码在这里。
第 9 行:
当i == 2
,pos == 2
。第9行的执行顺序是这样的
- 如果 while 循环最初第一次执行,
arr[2] = arr[pos-1]
。
- 定位数组索引2。但是定位后
pos
减少到pos == 1
。
- 然后行变成这个
arr[2] = arr[1-1]
表示arr[2] = arr[0]
。
- 在那之后仍然
while
循环是正确的。
- 然后 while 循环的第二次执行最初是
arr[1] = arr[pos-1]
。
- 然后定位数组索引1。但是定位后
pos
递减为pos == 0
。
- 然后行变成这个
arr[1] = arr[0-1]
表示arr[1] = arr[-1]
。
- 所以错误发生在这里。 (
ArrayIndexOutOfBounds
).
修改后的代码是这样的。 (第 9 行)
arr[pos--] = arr[pos];
或
arr[pos] = arr[--pos];
这是Java中插入排序的简单代码。我尝试减少 Java 代码的行数。但是这个问题是做不到的。我想知道为什么做不到。
我试过的代码(错误发生在第9行)
import java.util.Scanner;
public class InsertionSortModified {
public static int[] insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int pos = i;
while (pos > 0 && arr[pos-1] > temp)
arr[pos--] = arr[pos-1];
arr[pos] = temp;
}
return arr;
}
public static void main(String args[]) {
Scanner scnr = new Scanner(System.in);
int elementarr[] = new int[5];
for (int j = 0; j < 5; j++)
elementarr[j] = scnr.nextInt();
elementarr = insertionSort(elementarr);
for (int j = 0; j < elementarr.length; j++)
System.out.print(elementarr[j] + " ");
}
}
命令显示错误window
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at InsertionSortModified.insertionSort(InsertionSortModified.java:9)
at InsertionSortModified.main(InsertionSortModified.java:22)
当代码修改成这样时,程序正在运行。 (第 8 至 11 行)
while (pos > 0 && arr[pos-1] > temp) {
arr[pos] = arr[pos-1];
pos--;
}
为什么我不能使用
arr[pos--] = arr[pos-1];
当你想做的时候
arr[pos--] = arr[pos-1];
并且 pos
的值是 1
然后它将 pos
递减到 0,然后在 pos
的第二次使用中你使它成为 0 - 1
在第 9 行中,您递减计数器的顺序错误。正确的行是
`arr[pos] = arr[--pos];`
此处您将 arr[pos] 中的当前值交换为 arr[pos-1] 中的当前值,因为您在使用它之前减少了计数器。之后,pos值已经在正确的位置插入'temp'值
我找到问题所在了。一步一步执行代码在这里。
第 9 行:
当i == 2
,pos == 2
。第9行的执行顺序是这样的
- 如果 while 循环最初第一次执行,
arr[2] = arr[pos-1]
。 - 定位数组索引2。但是定位后
pos
减少到pos == 1
。 - 然后行变成这个
arr[2] = arr[1-1]
表示arr[2] = arr[0]
。 - 在那之后仍然
while
循环是正确的。 - 然后 while 循环的第二次执行最初是
arr[1] = arr[pos-1]
。 - 然后定位数组索引1。但是定位后
pos
递减为pos == 0
。 - 然后行变成这个
arr[1] = arr[0-1]
表示arr[1] = arr[-1]
。 - 所以错误发生在这里。 (
ArrayIndexOutOfBounds
).
修改后的代码是这样的。 (第 9 行)
arr[pos--] = arr[pos];
或
arr[pos] = arr[--pos];