关于功能:在循环中间返回和/或中断。

Returns and/or breaks in the middle of a loop. Is it ever acceptable?

假设我们有一个整数数组。我们编写了一个函数来获取数组中第一个指定值的索引,如果数组不包含该值,则为-1。

例如,如果array = { 4, 5, 4, 4, 7 },那么getFirstIndexOf(4)将返回0,getFirstIndexOf(7)将返回4,getFirstIndexOf(8)将返回-1。

下面,我介绍了三种不同的方法来编写这个函数。returns在函数中间,breaks在循环中间,这是一种广泛接受的编码标准。在我看来,这对他们来说可能是一个可以接受的用途。

1
2
3
4
5
6
7
8
9
public int getFirstIndexOf(int specifiedNumber) {
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber) {
      return i;
    }
  }

  return -1;
}

VS

1
2
3
4
5
6
7
8
9
10
11
public int getFirstIndexOf(int specifiedNumber) {
  int result = -1;
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber) {
      result = i;
      break;
    }
  }

  return result;
}

VS

1
2
3
4
5
6
7
8
9
10
public int getFirstIndexOf(int specifiedNumber) {
  int result = -1;
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber && result == -1) {
      result = i;
    }
  }

  return result;
}

你怎么认为?哪一个最好?为什么?有没有其他方法可以做到这一点?


我认为当你已经找到你的结果的时候运行一个完整的循环是不好的实践…

如果你真的想避免使用从循环中间返回,我建议使用"sentinel"来停止循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public int getFirstIndexOf(int specifiedNumber, int[] array) {

    boolean found = false;
    boolean exit = false;
    int i = 0;
    int arraySize = array.length();

    while(!found && !exit) {
        if(array[i] == specifiedNumber) {
            found = true;
        } else {
            if(i++ > arraySize) {
            exit = true;
            }
        }

    if(found ==true) {
       return i;
    } else {
       return 99999;
    }
}

编辑:我讨厌在stackoverflow中使用空格缩进代码…


这就是为什么……当&while循环被发明时。

按要求:

1
2
3
4
5
6
public int getFirstIndexOf(int specifiedNumber) {
    int i = array.Length;
    while(--i > -1 && array[i] != specifiedNumber);

    return i;      
}