Java 为什么最后一个案例不运行if块?

Java 为什么最后一个案例不运行if块?,java,arrays,if-statement,for-loop,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 + " oc

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

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));
}
现在,如果我去掉
for
-循环后面的
println
,即

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));
}
换句话说,
if
不执行if
list[i]
是数组的最大值。为什么会这样?对于上面的示例,第一个
4
的索引是
i=4
,而
list[4]>3
,因此满足条件语句,但它仍然不会执行

如何调整代码,使
if
块在所有情况下都能运行


谢谢

最后的
println
是必需的,因为您正在触发您的print语句,以更改
list[i]
的值,并打印前一个值的结果。在程序结束时,没有检测到最后一个“更改”,因此您需要单独处理最后一个案例

这是一种标准的编码模式(循环后需要进行最后的操作),每当序列中的变量更改触发批处理结束时的操作时,就会出现这种模式。一种思考方式是,存在一个虚拟值,一个超过数组末尾的值,它总是大于任何可能的先前值,并表示数据结束。无需对其进行测试或实际实现,但仍然需要对操作进行编码(在您的示例中是a
println

操作可能要复杂得多,在这种情况下,您应该将其封装在一个方法中,以避免代码重复。将
println
封装在方法
outputCount(int-value,int-count)
中,您的代码可能会稍微受益。 比如说

private void outputCount(int value, int count) {
    System.out.println(value + " occurs " + count + timeOrTimes(count));
}

对于您的用例来说,这几乎不值得,但是如果批处理结束操作的代码远远超过一行,我肯定会为它编写一个方法,而不是重复代码。

Ah,这更有意义。谢谢你的简明解释。为了确保我理解正确,对于依赖变量更改的for循环,应该有一些代码在循环完成后执行,以显示最终更改,对吗?这是正确的,当您故意运行数组末尾时,您必须处理最后一批没有“之后”更改的数据它可以触发求和(或其他)。请看我的扩展答案。您介意演示如何封装此代码吗?我是Java初学者,还没有学会这个概念。更新。您已经使用
timeOrTimes()
:-)完成了一次封装,它可以有多种含义,但它只意味着在某些东西周围放置一个包装器。更正式地说,它指的是一个类对外部世界隐藏其内部,只公开其API或与客户机交互的“契约”。这个问题是一个初学者级别的问题,但经过深思熟虑,写得很好,抓住了所有必要的要点。我希望更多的初学者问题能像这个一样好。
1 occurs 2 times
2 occurs 1 time
3 occurs 1 time
private void outputCount(int value, int count) {
    System.out.println(value + " occurs " + count + timeOrTimes(count));
}