Объяснение для 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 в сравнении?
Ответы
Ответ 1
но для этого метода я не понимаю цели 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
.
Ответ 2
Вместо инициализации переменных с произвольными значениями (например, int smallest = 9999, largest = 0
) безопаснее инициализировать переменные с наибольшими и наименьшими значениями, представляемыми этим типом номера (то есть int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE
).
Поскольку ваш целочисленный массив не может содержать значение больше Integer.MAX_VALUE
и меньше, чем Integer.MIN_VALUE
, ваш код работает во всех случаях краев.
Ответ 3
Путем инициализации минимальных/максимальных значений до их крайней противоположности вы избегаете любых случаев краев значений на входе: любой из min/max фактически является одним из этих значений (в случае, когда вход состоит только из одного из этих значений), или будет найден правильный min/max.
Следует отметить, что примитивные типы должны иметь значение. Если вы использовали объекты (т.е. Integer
), вы можете инициализировать значение null
и обрабатывать этот специальный случай для первого сравнения, но это создает дополнительный (ненужный) код. Однако, используя эти значения, код цикла не должен беспокоиться о краевом случае первого сравнения.
Другой альтернативой является установка обоих начальных значений на первое значение входного массива (никогда не проблема - см. ниже) и итерацию со второго элемента вперед, так как это единственное правильное состояние min/max после одной итерации. Вы также можете выполнить итерацию с первого элемента - это не имело бы никакого значения, кроме выполнения одной лишней и ненужной итерации по первому элементу.
Единственный разумный способ справиться с нулевым размером нуля - просто: бросьте IllegalArgumentException
, потому что min/max undefined в этом случае.