【问题标题】:Why does my 'if' statement in my 'why' loop not change one of my objects?为什么我的“为什么”循环中的“如果”语句不会更改我的对象之一?
【发布时间】:2016-10-08 06:09:20
【问题描述】:

我是 Java 新手,我正在创建一个简单的程序,该程序从另一个程序获取信息输出并通过命令行循环使用它。无论我看多少次,我都无法弄清楚为什么'if(minValue> value'不会改变minValue。

给定一些可能会产生 minValue 的信息的输出:

Count:3
Minimum: 0 @
Maximum: 75 @ DummyDate3 DummyTime3
Average: 45.00

这是 while 循环的结果吗?

int minValue = 0;
    int maxValue = 0;
    String minValueTime = "";
    String minValueDate = "";
    String maxValueDate = "";
    String maxValueTime = "";
    int count = 0;
    double average = 0;

    /*
     * For as long as input is going through A date, a time, and a value
     * will come through as a loop If the minimum value is less than the
     * value coming through The minimum value will become the value. If the
     * maximum value is less than the value, the maximum value will become
     * the value.
     */
    while (input.hasNext() == true) {
        String date = (input.next());
        String time = (input.next());
        int value = (input.nextInt());
        if (minValue > value) {
            minValue = value;
            minValueDate = date;
            minValueTime = time;
        }
        if (maxValue < value) {
            maxValue = value;
            maxValueDate = date;
            maxValueTime = time;
        }
        count++;
        average = average + value;
    }

    input.close();

    System.out
            .printf("Count:%d%nMinimum: %d @ %s %s%nMaximum: %d @ %s %s%nAverage: %.2f%n",
                    count, minValue, minValueDate, minValueTime, maxValue,
                    maxValueDate, maxValueTime, average / count);
}

编辑:我尝试过 Integer.MAX_VALUE 和 MIN_VALUE,但它们都分别导致 MAX_VALUE 和 MIN_VALUE 的值。

【问题讨论】:

  • minValue &gt; value 只会在您的输入为负整数时评估为 true,因为 minValue 已初始化为 0。这可能不是您想要的。
  • 将 minValue 分配给最高数字,将 maxValue 分配给最低数字。
  • 对于这种模式,您通常希望将 Min 初始化为 Integer.MAX_VALUE 并将 max 初始化为 Integer.MIN_VALUE。见here
  • 不过,它也使用 Integer.MIN_VALUE 执行此操作,结果为“-2147482168”。 0 是唯一允许 maxValue 产生除 '2147482168' 以外的任何值。

标签: java if-statement while-loop


【解决方案1】:

分配给 min 的第一个值是 0。如果读取的每个整数都大于 0,则它永远不会改变。您实际需要做的是将 max 和 min 分配给 minValue 和 maxValue :

int minValue = Integer.MAX_VALUE;
int maxValue = Integer.MIN_VALUE;

这样,读取的第一个值很可能低于当前的最小值,并且第一个值也将高于当前的最大值。

这些值的最小值不能高于这个值,最大值也不能低于这个值。

【讨论】:

  • 这导致:计数:3 最小值:-2147483648 @ 最大值:2147483647 @ 平均值:45.00
  • @CralineRashnila 您可能已将 min 分配给 MIN 并将 max 分配给 MAX。根据 shak 的回答,您需要切换它。
  • 哦,现在我明白了。非常抱歉,非常感谢您的帮助!
【解决方案2】:

上面使用Integer.MAX_VALUEInteger.MIN_VALUE 的答案可以正常工作,但是如果您知道要循环的数组或输入至少有一个条目,则经常使用的另一种技术是将minValuemaxValue 初始化为第一个条目。

例如

int firstEntry = input.nextInt();
int minValue = firstEntry;
int maxValue = firstEntry;

while (input.hasNext()) {
    int currentVal = input.nextInt();
    minValue = Math.min(minValue, currentVal);
    maxValue = Math.max(maxValue, currentVal);
}

【讨论】:

  • 我没有提出这个解决方案,因为她也在为 maxDate 和 maxTime 分配一个值,以防 maxValue 和 minValue 发生变化。如果她不关心日期和时间,你的解决方案会更好。
  • 这真的很有趣,我从来没有想过这样的事情。这当然是我将来会考虑的事情,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2014-11-25
  • 1970-01-01
  • 2016-10-22
  • 2021-12-05
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多