在 Java 中查找第三小的数字:完整指南
已发表: 2023-08-23您是否想知道如何有效地找到数组、列表或整数流中第三小的数字? 在这篇博文中,我们将深入 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)
,因为它是一个简单的数组或列表查找。
- 数组方法:此方法对数组进行就地排序,因此不需要额外的内存来存储新的排序集合。 与列表和流方法相比,这可以导致稍微更好的内存使用。
- 列表方法:此方法使用流将列表转换为排序列表。 虽然方便,但它涉及创建一个新列表,这会消耗额外的内存。 如果内存使用至关重要,这可能是一个问题。
- Stream 方法: stream 方法非常灵活且实用,但它涉及将流收集到列表中。 与直接对数组进行排序相比,这会在内存和处理方面增加少量开销。
如果您在运行此代码时遇到任何问题,请告诉我。