Tia*_*Tia 26 java arrays numbers
我似乎不知道如何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]
Run Code Online (Sandbox Code Playgroud)
但至于这种方法,我不明白的目的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);
}
}
Run Code Online (Sandbox Code Playgroud)
那么Integer.MIN_VALUE和Integer.MIN_VALUE在比较中的用途是什么?
T.J*_*der 32
但至于这个方法,我不明白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.
请注意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
}
}
Run Code Online (Sandbox Code Playgroud)
要修复它,要么:
不要使用else,或
从第一个元素开始smallest并largest等于第一个元素,然后循环其余的元素,保持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
}
}
Run Code Online (Sandbox Code Playgroud)
Sal*_*n A 15
不是使用任意值初始化变量(例如int smallest = 9999, largest = 0),而是使用该数字类型(即int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE)表示的最大和最小值初始化变量更安全.
由于您的整数数组不能包含大于Integer.MAX_VALUE和小于Integer.MIN_VALUE您的代码的值,因此可以在所有边缘情况下使用.
通过将最小值/最大值初始化为它们的极端相反值,您可以避免输入中值的任何边缘情况:最小值/最大值之一实际上是这些值之一(在输入仅包含这些值之一的情况下),否则会找到正确的最小值/最大值。
需要注意的是,原始类型必须有一个值。如果您使用对象(即Integer),您可以初始化值null并处理第一次比较的特殊情况,但这会创建额外的(不必要的)代码。但是,通过使用这些值,循环代码无需担心第一次比较的边缘情况。
另一种选择是将两个初始值都设置为输入数组的第一个值(从来没有问题 - 见下文)并从第二个元素开始迭代,因为这是一次迭代后最小/最大的唯一正确状态。您也可以从第一个元素进行迭代 - 除了对第一个元素进行一次额外(不必要的)迭代之外,它没有任何区别。
处理大小为零的 inout 的唯一合理方法很简单:抛出 an IllegalArgumentException,因为在这种情况下 min/max 未定义。
| 归档时间: |
|
| 查看次数: |
156816 次 |
| 最近记录: |