在 Java 中查找第三小的数字:完整指南

已发表: 2023-08-23

您是否想知道如何有效地找到数组、列表或整数流中第三小的数字? 在这篇博文中,我们将深入 Java 编程世界,并探索用于识别各种数据源中第三小的数字的不同技术。

在 Java 中查找第三小的数字 - 综合指南

在进行数据操作和分析时,经常需要识别数字集合中的特定元素。 找到最小或最大的数字相对简单,但确定第三小的数字需要更多的技巧。 在这篇博文中,我们将介绍使用 Java 解决此问题的三种方法:对数组进行排序、对列表进行排序以及利用流。

方法一:对数组进行排序

数组是 Java 中的基本数据结构之一,使它们成为我们探索的自然起点。 这里的想法是按升序对数组进行排序,然后检索索引 2 处的元素。

方法 2:对列表进行排序

列表为数组提供了更灵活的替代方案,允许动态调整大小和更轻松的操作。 要找到列表中第三小的数字,我们可以遵循类似的数组排序方法。

方法 3:利用流

Java 流是处理元素序列的强大方法。 我们可以使用流对元素进行排序,然后检索第三小的数字。

选择正确的方法

每种方法都有其自身的优点和用例。 如果您手头有一个数组,则数组排序方法可能是最有效的。 列表用途广泛,提供更多便利,而流则提供函数式方法,可以轻松处理更大的数据集。

这是一个完整的例子:

CrunchyThirdSmallestNumberFinder.java

 包 crunchify.com.tutorial;

导入java.util.Arrays;
导入java.util.List;
导入java.util.stream.Collectors;
导入 java.util.stream.Stream;

/**
 * @作者 Crunchify.com
 * 在 Java 中查找第三小的数字:综合指南
 *
 */

公共类 CrunchyThirdSmallestNumberFinder {

    // 查找数组中第三小的数字的方法
    公共静态 int findCrunchyThirdSmallest(int[] crunchArr) {
        if (crunchArr.length < 3) {
            throw new IllegalArgumentException("数组应包含至少 3 个 crunch 元素");
        }

        // 按升序对crunchy数组进行排序
        Arrays.sort(crunchArr);
        返回 crunchArr[2]; // 返回第三小的脆元素
    }

    // 查找列表中第三小的数字的方法
    公共静态 int findCrunchyThirdSmallest(List<Integer> crunchList) {
        if (crunchList.size() < 3) {
            throw new IllegalArgumentException("列表应包含至少 3 个 crunch 元素");
        }

        // 使用流对 crunchy 列表进行排序,并将排序后的元素收集到一个新列表中
        List<Integer>sortedCrunchList = crunchList.stream()
                .sorted()
                .collect(Collectors.toList());

        返回sortedCrunchList.get(2); // 返回第三小的脆元素
    }

    // 查找流中第三小的数字的方法
    公共静态 int findCrunchyThirdSmallest(Stream<Integer> crunchStream) {
        // 从 crunchy 流中收集元素,对它们进行排序,然后收集到一个列表中
        List<Integer> SortedCrunchList = crunchStream.sorted().collect(Collectors.toList());

        if (sortedCrunchList.size() < 3) {
            throw new IllegalArgumentException("Stream 应包含至少 3 个 crunch 元素");
        }

        返回sortedCrunchList.get(2); // 返回第三小的脆元素
    }

    公共静态无效主(字符串[] 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 中运行上面的程序,您将得到如下结果。

 松脆第三小的 arr:31
脆脆的名单中第三小的:14
流中第三小的松脆:62

进程已完成,退出代码为 0

有一些性能差异需要考虑:

就时间复杂度而言,这三种方法都有类似的排序步骤,通常时间复杂度为O(n log n) ,其中“n”是集合(数组、列表或流)中元素的数量。

访问第三小的元素的时间复杂度是常数, O(1) ,因为它是一个简单的数组或列表查找。

  1. 数组方法:此方法对数组进行就地排序,因此不需要额外的内存来存储新的排序集合。 与列表和流方法相比,这可以导致稍微更好的内存使用。
  2. 列表方法:此方法使用流将列表转换为排序列表。 虽然方便,但它涉及创建一个新列表,这会消耗额外的内存。 如果内存使用至关重要,这可能是一个问题。
  3. Stream 方法: stream 方法非常灵活且实用,但它涉及将流收集到列表中。 与直接对数组进行排序相比,这会在内存和处理方面增加少量开销。

如果您在运行此代码时遇到任何问题,请告诉我。