考虑以下代码,该代码计算数组中每个元素的数量:
public static void getCounts(int[] list) {
int current = list[0];
int count = 0;
for (int i = 0; i < list.length; i++, count++) {
if (list[i] > current) {
System.out.println(current + " occurs " + count + timeOrTimes(count));
current = list[i];
count = 0;
}
}
System.out.println(current + " occurs " + count + timeOrTimes(count));
}
对于这个问题,请假设list
按升序排序。例如,如果list
为[1, 1, 2, 3, 4, 4]
,则输出为:
1 occurs 2 times
2 occurs 1 time
3 occurs 1 time
4 occurs 2 times
现在,如果我摆脱println
- 循环之后的for
,即
public static void getCounts(int[] list) {
int current = list[0];
int count = 0;
for (int i = 0; i < list.length; i++, count++) {
if (list[i] > current) {
System.out.println(current + " occurs " + count + timeOrTimes(count));
current = list[i];
count = 0;
}
}
// System.out.println(current + " occurs " + count + timeOrTimes(count));
}
然后使用相同的示例输入,输出变为:
1 occurs 2 times
2 occurs 1 time
3 occurs 1 time
换句话说,如果if
是数组的最大值,则list[i]
块不会执行。为什么会这样?对于上面的示例,第一个4
的索引是i = 4
和list[4] > 3
,因此符合条件语句,但它仍然无法执行。
如何调整代码以便if
块可以针对所有情况运行?
由于
答案 0 :(得分:3)
最终的println
是必要的,因为您正在list[i]
的更改上触发打印语句并打印之前的结果价值。在课程结束时,没有最后的改变&#34;要检测,所以你需要单独处理最后一个案例。
这(循环后需要进行最终操作)是一种标准编码模式,它发生在序列中的变量触发批处理结束时的操作的任何时候。考虑它的一种方法是,存在一个虚拟值,一个超过数组末尾的虚拟值,它总是大于任何可能的先前值,并表示数据的结束。没有必要对其进行测试或实际实现它,但您仍然需要对操作进行编码(在您的情况下为println
)。
操作可能要复杂得多,在这种情况下,您将其封装在一个方法中以避免代码重复。您的代码可以通过将println
封装在方法outputCount(int value, int count)
中来使稍微受益。
例如
private void outputCount(int value, int count) {
System.out.println(value + " occurs " + count + timeOrTimes(count));
}
对于您的用例,它几乎不值得,但如果批处理操作超过1行代码,我肯定会为它编写一个方法,而不是重复代码。