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

我似乎不明白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]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在比较中的用途是什么?

但至于这个方法,我不明白Integer.MAX_VALUE和Integer.MIN_VALUE的目的。

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

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


请注意Onome Sotu在评论中提出的观点:

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

这是真的; 这是一个更简单的例子来演示问题( 实时复制 ):

 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

这是第二个例子( 实时复制 ):

 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您的代码适用于所有边缘情况。

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

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

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

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