在 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 方法非常灵活且实用,但它涉及将流收集到列表中。 与直接对数组进行排序相比,这会在内存和处理方面增加少量开销。
如果您在运行此代码时遇到任何问题,请告诉我。
