Integer.MAX_VALUE和Integer.MIN_VALUE的解释,用于查找数组中的最小值和最大值

时间:2015-06-06 17:28:25

标签: java arrays numbers

我似乎不明白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);
    }

}
  • System.out.println(Integer.MAX_VALUE)给出2147483647
  • System.out.println(Integer.MIN_VALUE)给出-2147483648

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

3 个答案:

答案 0 :(得分:28)

  

但至于这种方法,我并不了解Integer.MAX_VALUE和Integer.MIN_VALUE的目的。

首先将smallest设置为Integer.MAX_VALUE并将largest设置为Integer.MIN_VALUE,他们以后不必担心特殊情况smallest 1}}和largest还没有价值。如果我查看的数据的第一个值为10,那么numbers[i]<smallest将为真(因为10< Integer.MAX_VALUE)我们会将smallest更新为10。同样,numbers[i]>largest将为true,因为10> Integer.MIN_VALUE,我们会更新largest。等等。

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

注意the point Onome Sotu在评论中提出:

  

...如果数组中的第一项大于其余项,则由于else-if语句,最大项将始终为Integer.MIN_VALUE。

这是真的;这是一个演示问题的简单示例(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. smallest开始,largest等于第一个元素,然后循环其余元素,保留else if

  3. 以下是第二个示例(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
        }
    }
    

答案 1 :(得分:13)

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

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

答案 2 :(得分:3)

通过将min / max值初始化为极端相反的值,可以避免输入中任何值的边缘情况:min / max中的任何一个实际上是其中一个值(在输入仅包含一个值的情况下)这些值),或找到正确的最小/最大值。

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

另一种方法是将两个初始值都设置为输入数组的第一个值(从来没有问题 - 见下文)并从 2nd 元素向前迭代,因为这是唯一正确的状态一次迭代后的最小值/最大值。你也可以从第一个元素迭代 - 除了在第一个元素上做一个额外的(不必要的)迭代之外,它没有任何区别。

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