Function 循环中的返回和/或中断。这是可以接受的吗?
假设我们有一个整数数组。我们编写了一个函数来获取数组中第一个指定值的索引,如果数组不包含该值,则返回-1 例如,如果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
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;
}