Integer.MAX_VALUE和Integer.MIN_VALUE的解释,用于查找数组中的最小值和最大值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Integer.MAX_VALUE和Integer.MIN_VALUE的解释,用于查找数组中的最小值和最大值相关的知识,希望对你有一定的参考价值。
我似乎不明白Integer.MAX_VALUE
和Integer.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_VALUE
和Integer.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在比较中的用途是什么?
但至于这个方法,我不明白Integer.MAX_VALUE和Integer.MIN_VALUE的目的。
开始时smallest
设置为Integer.MAX_VALUE
,largest
设置为Integer.MIN_VALUE
,他们后来不必担心smallest
和largest
还没有值的特殊情况。如果我正在查看的数据有10
作为第一个值,那么numbers[i]<smallest
将是真的(因为10
是<
Integer.MAX_VALUE
)并且我们将smallest
更新为10
。同样,numbers[i]>largest
将是true
,因为10
是>
Integer.MIN_VALUE
,我们将更新largest
。等等。
当然,在执行此操作时,您必须确保在您正在查看的数据中至少有一个值。否则,你最终会在smallest
和largest
中出现伪造的数字。
注意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
}
}
要修复它,要么:
- 不要使用
else
,或 - 从
smallest
和largest
开始,等于第一个元素,然后循环其余元素,保持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
的值,因此您的代码适用于所有边缘情况。
通过将min / max值初始化为极端相反的值,可以避免输入中任何值的边缘情况:min / max中的任何一个实际上是这些值中的一个(在输入仅包含其中一个值的情况下) ),或找到正确的最小/最大值。
应该注意,原始类型必须具有值。如果您使用了对象(即Integer
),您可以将值初始化为null
并处理第一次比较的特殊情况,但这会产生额外的(不必要的)代码。但是,通过使用这些值,循环代码不需要担心第一次比较的边缘情况。
另一种方法是将两个初始值都设置为输入数组的第一个值(从来没有问题 - 见下文),然后从第二个元素开始迭代,因为这是一次迭代后唯一正确的最小/最大值状态。你也可以从第一个元素迭代 - 除了在第一个元素上做一个额外的(不必要的)迭代之外,它没有任何区别。
处理大小为零的输入的唯一理智方法很简单:抛出一个IllegalArgumentException
,因为在这种情况下min / max是未定义的。
以上是关于Integer.MAX_VALUE和Integer.MIN_VALUE的解释,用于查找数组中的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章
Integer.MAX_VALUE和Integer.MIN_VALUE的解释,用于查找数组中的最小值和最大值
Spark Java 错误:大小超过 Integer.MAX_VALUE
为啥 FileChannel.map 占用了 Integer.MAX_VALUE 的数据?
“NzSQLException:更新计数超过 Integer.MAX_VALUE”错误仅在 JDBC 连接上