关于 Integer.MAX_VALUE 和 Integer.MIN_VALUE 在数组中查找最小值和最大值的说明

Explanation on Integer.MAX_VALUE and Integer.MIN_VALUE to find min and max value in an array

我似乎不明白 Integer.MAX_VALUEInteger.MIN_VALUE 如何帮助找到数组中的最小值和最大值。

我了解此方法(下面的伪代码)在查找最小值和最大值时的工作原理:

max = A[0], min = A[0]
for each i in A
  if A[i] > max then max = A[i]
  if A[i] < min then min = A[i] 

但是对于这个方法,我不明白Integer.MAX_VALUEInteger.MIN_VALUE的目的:

import java.util.Scanner;

class MyClass {

    public static void main(String[] args) {

        int[] numbers; // declaring the data type of numbers
        numbers = new int[3]; //assigning the number of values numbers will contain
        int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE;

        Scanner input = new Scanner(System.in);

        System.out.println("Please enter 3 numbers");

        for(int counter = 0; counter<numbers.length;counter++) {
            numbers[counter] = input.nextInt();
        }

        for(int i = 0; i<numbers.length; i++) {
            if(numbers[i]<smallest)
                smallest = numbers[i];
            else if(numbers[i]>largest)
                largest = numbers[i];
        }

        System.out.println("Largest is "+largest);
        System.out.println("Smallest is "+smallest);
    }

}

那么 Integer.MIN_VALUE 和 Integer.MIN_VALUE 在比较中的作用是什么?

通过将 min/max 值初始化为它们的极端相反值,您可以避免输入中值的任何边缘情况:min/max 中的任何一个实际上都是这些值之一(在这种情况下输入仅包含这些值之一),否则将找到正确的 min/max。

需要注意的是原始类型必须有一个值。如果您使用对象(即 Integer),您可以将值初始化为 null 并处理第一次比较的特殊情况,但这会创建额外的(不必要的)代码。但是,通过使用这些值,循环代码无需担心第一次比较的边缘情况。

另一种方法是将两个初始值都设置为输入数组的第一个值(没问题 - 见下文)并从 2nd 元素开始迭代,因为这是一次迭代后 min/max 的唯一正确状态。您也可以从第一个元素开始迭代 - 除了对第一个元素进行一次额外(不必要的)迭代之外,这没有任何区别。

处理大小为零的 inout 的唯一合理方法很简单:抛出一个 IllegalArgumentException,因为 min/max 在这种情况下未定义。

but as for this method, I don't understand the purpose of Integer.MAX_VALUE and Integer.MIN_VALUE.

通过将 smallest 设置为 Integer.MAX_VALUE 并将 largest 设置为 Integer.MIN_VALUE,他们以后不必担心 smallestlargest 还没有值。如果我正在查看的数据有一个 10 作为第一个值,那么 numbers[i]<smallest 将为真(因为 10< Integer.MAX_VALUE)并且我们会将 smallest 更新为 10。同样,numbers[i]>largest 将是 true,因为 10> Integer.MIN_VALUE,我们将更新 largest。等等。

当然,在执行此操作时,您必须确保您正在查看的数据中至少有一个值。否则,您最终会在 smallestlargest.

中得到伪造的数字

注释在评论中提出:

...if the first item in the array is larger than the rest, then the largest item will always be Integer.MIN_VALUE because of the else-if statement.

这是真的;这是一个更简单的例子来说明问题 (live copy):

public class Example
{
    public static void main(String[] args) throws Exception {
        int[] values = {5, 1, 2};
        int smallest = Integer.MAX_VALUE;
        int largest  = Integer.MIN_VALUE;
        for (int value : values) {
            if (value < smallest) {
                smallest = value;
            } else if (value > largest) {
                largest = value;
            }
        }
        System.out.println(smallest + ", " + largest); // 1, 2 -- WRONG
    }
}

要修复它,可以:

  1. 不要使用else,或者

  2. smallestlargest开始等于第一个元素,然后循环剩余的元素,保持else if.

这是第二个示例 (live copy):

public class Example
{
    public static void main(String[] args) throws Exception {
        int[] values = {5, 1, 2};
        int smallest = values[0];
        int largest  = values[0];
        for (int n = 1; n < values.length; ++n) {
            int value = values[n];
            if (value < smallest) {
                smallest = value;
            } else if (value > largest) {
                largest = value;
            }
        }
        System.out.println(smallest + ", " + largest); // 1, 5
    }
}

与其用任意值初始化变量(例如 int smallest = 9999, largest = 0),不如用该数字类型(即 int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE)可表示的最大值和最小值初始化变量更安全。

由于您的整数数组不能包含大于 Integer.MAX_VALUE 且小于 Integer.MIN_VALUE 的值,您的代码适用于所有边缘情况。