在循环中间返回和/或中断。它是否可以接受?

时间:2011-07-12 12:48:30

标签: function language-agnostic loops return break

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

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

下面,我介绍了三种编写此功能的方法。它是一种广泛接受的编码标准,returns位于函数中间,而breaks位于循环中间是不好的做法。在我看来,这可能是他们可以接受的用途。

public int getFirstIndexOf(int specifiedNumber) {
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber) {
      return i;
    }
  }

  return -1;
}

VS

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

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;
}
你怎么看?哪个最好?为什么?有没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

我认为当你找到结果时运行一个完整的循环是不好的做法......

如果你真的想避免在循环中间使用return,我会使用“sentinel”来阻止你的循环。

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中使用空格缩进代码...

答案 1 :(得分:1)

这就是为什么做...而&amp;发明了 while 循环。

根据要求:

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

    return i;       
}