为什么if-block没有针对最终案例运行?

时间:2016-07-30 23:22:16

标签: java arrays if-statement for-loop

考虑以下代码,该代码计算数组中每个元素的数量:

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 = 4list[4] > 3,因此符合条件语句,但它仍然无法执行。

如何调整代码以便if块可以针对所有情况运行?

由于

1 个答案:

答案 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行代码,我肯定会为它编写一个方法,而不是重复代码。