Подтвердить что ты не робот

Объяснение для 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 в сравнении?

4b9b3361

Ответ 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 в этом случае.