我不明白这种比较

时间:2014-08-14 23:47:11

标签: java

我目前正在浏览麻省理工学院的java软件课程,我不确定为什么会涉及一段代码。我尝试删除代码以确定是否有必要并且它使程序无法运行。

我有两个数组,一个是跑步者的名字,另一个是他们的时间。目标是找到最低(最快)时间的索引,然后给予该人第二快的时间。即命令提示符将输出john是最快的,而kate是第二快的

我感到困惑的部分是" secondIndex == -1 ||" ---这是为什么?如果我删除它我得到错误

线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:-1

public static int getSecondIndex(int[] values) {
    int minIndex = getMinIndex(values);
    int secondIndex = -1;

    for(int i = 0; i < values.length; i++) {
        if(i == minIndex){
            continue;
        }
        if(secondIndex == -1 ||
            values[i] < values[secondIndex]) {
            secondIndex = i;
        }
    }
        return secondIndex;
}

4 个答案:

答案 0 :(得分:5)

然后它将评估在索引-1处没有条目的values[secondIndex]。从左到右的||短路,所以在secondIndex = -1的情况下,永远不会评估values[secondIndex]

答案 1 :(得分:1)

这是因为循环检查当前跑步者的时间是否小于目前为止的任何时间,但是当它检查第一个跑步者时,没有“迄今为止最快的跑步者”进行比较。因此,检查首先要确保secondIndex至少已经设置过一次。如果没有,那么or语句的第二部分永远不会被评估(称为短路评估)。

答案 2 :(得分:0)

之所以存在,是因为how indexOf works:它只能找到生活在索引0或更高位置的内容,因此如果无法找到任何内容,则返回-1。

因此,我们比较-1来看看是否找到了某些东西。如果不是,我们就不需要再浪费时间了:

if(thing.indexOf(otherthing) == -1) {
  // the search failed
}

如果是,我们可以使用结果立即查看它,将indexOf的结果用作数组索引。

答案 3 :(得分:0)

在尚未找到secondIndex == -1的情况下,此条件(secondIndex)为真。请记住,由于||是短路运算符,如果第一个条件为真,则不会计算第二个条件。因此,如果secondIndex为-1,则永远不会评估values[secondIndex](这很好,因为这样做会导致ArrayIndexOutOfBoundsException)。