Function 循环中的返回和/或中断。这是可以接受的吗?

Function 循环中的返回和/或中断。这是可以接受的吗?,function,language-agnostic,loops,return,break,Function,Language Agnostic,Loops,Return,Break,假设我们有一个整数数组。我们编写了一个函数来获取数组中第一个指定值的索引,如果数组不包含该值,则返回-1 例如,如果array={4,5,4,4,7},那么getFirstIndexOf(4)将返回0,getFirstIndexOf(7)将返回4,getFirstIndexOf(8)将返回-1 下面,我介绍了编写此函数的三种不同方法。在函数的中间,代码返回/是一个被广泛接受的编码标准,而在循环的中间中断/代码>是很差的实践。在我看来,这可能是他们可以接受的用途 public int getFir

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

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

下面,我介绍了编写此函数的三种不同方法。在函数的中间,代码<>返回/<代码>是一个被广泛接受的编码标准,而在循环的中间<代码>中断/代码>是很差的实践。在我看来,这可能是他们可以接受的用途

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

  return -1;
}
public int getFirstIndexOf(int指定的数字){
for(int i=0;i
VS

public int getFirstIndexOf(int指定的数字){
int结果=-1;
for(int i=0;i
VS

public int getFirstIndexOf(int指定的数字){
int结果=-1;
for(int i=0;i

你觉得怎么样?哪一个最好?为什么?也许还有其他方法可以做到这一点吗?

我认为在已经找到结果的情况下运行完整循环是一种糟糕的做法

如果您真的想避免使用循环中间的返回,我建议使用“哨兵”来停止您的循环

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

这就是为什么do…while&while循环被发明的原因

应要求:

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

    return i;       
}

你在哪里读到打破循环是一种糟糕的做法?提前退出循环有很多原因。@George,我听说
break
continue
goto
属于同一类。此外,MISRA编码指南曾建议不要使用
break
。那些告诉你不要使用
break
的人与那些告诉你不要使用
goto
的人一样愚蠢,一个很好的一半的真实世界的循环都有一个持续的条件,必须在循环体的中部检查,而不是在开始/结束。只要你完成了计算,就可以跳出一个循环。保存循环!呃,我不这么认为。一般来说(我认为有些语言有所不同),
do…while
while
仍然只在每个循环迭代开始时检查循环条件。它们不能代替从中间突破。执行…while循环在循环迭代结束时检查条件,while循环在顶部检查条件。我甚至没有想到过
执行while
循环。您能否使用
do while
从OP编写一个版本的
getFirstIndexOf
?在这种情况下,不相关的语义。除了第一次或最后一次迭代,循环迭代的结束和开始是一样的。我不熟悉哨兵。你能在OP中重写
getFirstIndexOf
方法,让每个人都能明白你的意思吗?
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;
    }
}
public int getFirstIndexOf(int specifiedNumber) {
    int i = array.Length;
    while(--i > -1 && array[i] != specifiedNumber);

    return i;       
}