关于 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_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 在比较中的作用是什么?
通过将 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
,他们以后不必担心 smallest
和 largest
还没有值。如果我正在查看的数据有一个 10
作为第一个值,那么 numbers[i]<smallest
将为真(因为 10
是 <
Integer.MAX_VALUE
)并且我们会将 smallest
更新为 10
。同样,numbers[i]>largest
将是 true
,因为 10
是 >
Integer.MIN_VALUE
,我们将更新 largest
。等等。
当然,在执行此操作时,您必须确保您正在查看的数据中至少有一个值。否则,您最终会在 smallest
和 largest
.
中得到伪造的数字
注释在评论中提出:
...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
}
}
要修复它,可以:
不要使用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
的值,您的代码适用于所有边缘情况。
我似乎不明白 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 在比较中的作用是什么?
通过将 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
,他们以后不必担心 smallest
和 largest
还没有值。如果我正在查看的数据有一个 10
作为第一个值,那么 numbers[i]<smallest
将为真(因为 10
是 <
Integer.MAX_VALUE
)并且我们会将 smallest
更新为 10
。同样,numbers[i]>largest
将是 true
,因为 10
是 >
Integer.MIN_VALUE
,我们将更新 largest
。等等。
当然,在执行此操作时,您必须确保您正在查看的数据中至少有一个值。否则,您最终会在 smallest
和 largest
.
注释
...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
}
}
要修复它,可以:
不要使用
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
的值,您的代码适用于所有边缘情况。