Поиск третьего наименьшего числа в Java: полное руководство

Опубликовано: 2023-08-23

Вы когда-нибудь задумывались, как эффективно найти третье наименьшее число в массиве, списке или потоке целых чисел? В этом сообщении блога мы окунемся в мир программирования на Java и рассмотрим различные методы определения третьего наименьшего числа в различных источниках данных.

Поиск третьего наименьшего числа в Java — подробное руководство

При работе с данными и их анализе часто возникает необходимость идентифицировать конкретные элементы внутри набора чисел. Найти наименьшее или наибольшее число относительно просто, но определение третьего наименьшего числа требует немного большей ловкости. В этом сообщении блога мы рассмотрим три метода решения этой проблемы с помощью Java: сортировку массива, сортировку списка и использование потоков.

Способ 1: сортировка массива

Массивы — одна из фундаментальных структур данных в Java, что делает их естественной отправной точкой для нашего исследования. Идея здесь состоит в том, чтобы отсортировать массив в порядке возрастания, а затем получить элемент с индексом 2.

Способ 2: сортировка списка

Списки представляют собой более гибкую альтернативу массивам, позволяя динамически изменять размер и упрощая манипулирование. Чтобы найти третье наименьшее число в списке, мы можем применить аналогичный подход к сортировке массива.

Метод 3: Использование потоков

Потоки Java — это мощный способ обработки последовательностей элементов. Мы можем использовать потоки для сортировки элементов, а затем получить третье наименьшее число.

Выбор правильного метода

Каждый метод имеет свои преимущества и варианты использования. Если у вас под рукой есть массив, метод сортировки массива может быть наиболее эффективным. Списки универсальны и более удобны, а потоки обеспечивают функциональный подход и позволяют легко обрабатывать большие наборы данных.

Вот полный пример:

CrunchyThirdSmallestNumberFinder.java

 пакет crunchify.com.tutorial;

импортировать java.util.Arrays;
импортировать java.util.List;
импортировать java.util.stream.Collectors;
импортировать java.util.stream.Stream;

/**
 * @author Crunchify.com
 * Поиск третьего наименьшего числа в Java: подробное руководство
 *
 */

общественный класс CrunchyThirdSmallestNumberFinder {

    // Метод для поиска третьего наименьшего числа в массиве
    public static int findCrunchyThirdSmallest(int[] crunchArr) {
        если (crunchArr.length <3) {
            throw new IllegalArgumentException("Массив должен содержать как минимум 3 элемента crunch");
        }

        // Сортируем массив в порядке возрастания
        Arrays.sort(crunchArr);
        вернуть crunchArr[2]; // Возвращаем третий наименьший хрустящий элемент
    }

    // Метод для поиска третьего наименьшего числа в списке
    public static int findCrunchyThirdSmallest(List<Integer> crunchList) {
        если (crunchList.size() <3) {
            throw new IllegalArgumentException("Список должен содержать не менее 3 элементов crunch");
        }

        // Сортируем подробный список с помощью потоков и собираем отсортированные элементы в новый список
        List<Integer> sortedCrunchList = crunchList.stream()
                .sorted()
                .collect(Коллекторы.toList());

        return sortedCrunchList.get(2); // Возвращаем третий наименьший хрустящий элемент
    }

    // Метод для поиска третьего наименьшего числа в потоке
    public static int findCrunchyThirdSmallest(Stream<Integer> crunchStream) {
        // Собираем элементы из хрустящего потока, сортируем их и собираем в список
        List<Integer> sortedCrunchList = crunchStream.sorted().collect(Collectors.toList());

        если (sortedCrunchList.size() <3) {
            throw new IllegalArgumentException("Поток должен содержать как минимум 3 элемента crunch");
        }

        return sortedCrunchList.get(2); // Возвращаем третий наименьший хрустящий элемент
    }

    public static void main(String[] args) {
        int[] crunchArr = {35, 62, 28, 31, 13, 97};
        List<Integer> crunchList = Arrays.asList(9, 14, 676, 62, 11, 328);
        Stream<Integer> crunchStream = Stream.of(427, 53, 71, 99, 25, 62);

        // Находим третье наименьшее число, используя разные источники
        int crunchyThirdSmallestFromArr = findCrunchyThirdSmallest(crunchArr);
        int crunchyThirdSmallestFromList = findCrunchyThirdSmallest(crunchList);
        int crunchyThirdSmallestFromStream = findCrunchyThirdSmallest (crunchStream);

        // Выводим четкие третьи наименьшие числа
        System.out.println("Crunchy третий наименьший из arr: " + crunchyThirdSmallestFromArr);
        System.out.println("Crunchy третий наименьший из списка: " + crunchyThirdSmallestFromList);
        System.out.println("Третий наименьший поток из потока: " + crunchyThirdSmallestFromStream);
    }
}

Результат консоли Eclipse:

Просто запустите вышеуказанную программу в Eclipse IDE или IntelliJ IDEA, и вы получите результат, как показано ниже.

 Хрустящий третий по размеру из обр: 31
Хрустящие третьи по величине из списка: 14
Crunchy третий по величине из потока: 62

Процесс завершен с кодом завершения 0

Следует учитывать некоторые различия в производительности:

С точки зрения временной сложности все три метода имеют схожие этапы сортировки, которые обычно имеют временную сложность O(n log n) , где 'n' — количество элементов в коллекции (массив, список или поток).

Временная сложность доступа к третьему наименьшему элементу постоянна, O(1) , поскольку это простой поиск в массиве или списке.

  1. Метод массива. Этот метод сортирует массив на месте, поэтому для новой отсортированной коллекции не требуется дополнительная память. Это может привести к немного лучшему использованию памяти по сравнению с методами списка и потока.
  2. Метод списка: этот метод преобразует список в отсортированный список с использованием потоков. Это удобно, но предполагает создание нового списка, что требует дополнительной памяти. Это может стать проблемой, если использование памяти имеет решающее значение.
  3. Метод потока. Метод потока довольно гибок и функционален, но он предполагает сбор потока в список. Это добавляет небольшие накладные расходы с точки зрения памяти и обработки по сравнению с прямой сортировкой массива.

Дайте мне знать, если у вас возникнут какие-либо проблемы при запуске этого кода.