我无法找到这个问题的答案。我正在处理插入排序方法,它无法正确执行:
public static <T extends Comparable<? super T>> void insertionSort(T[] array) {
int length = array.length;
T temp;
for (int i = 1; i < length; i++) { //start of unsorted
temp = array[i]; //save the element
int j = i-1;
while (temp.compareTo(array[j]) < 0 && j >= 0) { // while temp is less than array[j]
array[j+1] = array[j];
j--;
} //end of while
array[j+1] = temp; //as soon as temp is greater than array[j], set array[j] equal to temp
}
}
这在while循环行返回ArrayIndexOutOfBoundsException
,但当我将while循环中的条件切换到此时:
while (j >= 0 && temp.compareTo(array[j]) < 0)
它奏效了。我没想到在Java中,while循环中的条件顺序对程序很重要吗?这对我来说很奇怪,因为我在&&
的声明中从未见过或听说过顺序问题,因为我认为两个while循环行是等价的。我被困了一段时间,一直无法找到答案。
有人可以解释为什么会这样吗?
答案 0 :(得分:2)
条件从左到右评估。
最初,对于案例j=-1
,您的代码未评估第二个条件,因为第一个条件是抛出ArrayIndexOutOfBoundsException
例外。
while (temp.compareTo(array[j]) < 0 && j >= 0)
但是当你改变这样的条件时:
while (j >= 0 && temp.compareTo(array[j]) < 0)
然后对于相同的情况(j=-1
),因为第一个条件变为false
,那么无论第二个值如何,整个条件总是为假;所以第二个条件不会被评估,因此在这种情况下也不例外。
答案 1 :(得分:0)
让我们考虑以下示例:
boolean b = Condition_1 && Condition_2;
现在,如果Condition_1始终为false,那么无论Condition_2的值如何,b将始终为false。所以当第一个条件是假的&#39;和&#39;然后无需检查第二个条件的值,这就是这里发生的事情。
答案 2 :(得分:0)
如果您使用条件while (temp.compareTo(array[j]) < 0 && j >= 0)
,则完全错误
在Java中,它首先检查条件&&
,然后检查||
。
在条件&&
中,它检查顺序。
因此,在您的情况while (temp.compareTo(array[j]) < 0 && j >= 0)
中,它首先检查此条件temp.compareTo(array[j])
。如果j
超出数组索引,==&gt;你得到错误
当您将条件更改为while (j >= 0 && temp.compareTo(array[j]) < 0)
时,它首先检查j>=0
,如果j = -1
该程序无法继续进行。