Returns and/or breaks in the middle of a loop. Is it ever acceptable?
假设我们有一个整数数组。我们编写了一个函数来获取数组中第一个指定值的索引,如果数组不包含该值,则为-1。
例如,如果
下面,我介绍了三种不同的方法来编写这个函数。
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; } |