Java 中查找数组中的最大值和最小值
学习在 Java 中查找数组中的最大值和最小值。我们将讨论从简单迭代到 Stream API 的不同方法。
在给定的示例中,我们采用 int 值数组。我们也可以将所有给定的解决方案应用于对象数组或自定义类。对于自定义对象,我们只需要重写equals()方法并提供正确的逻辑来比较两个实例。
int[] items = { 10, 0, 30, 2, 7, 5, 90, 76, 100, 45, 55 }; // Min = 0, Max = 100
1. 使用 Stream API 查找最大值/最小值
Java 流提供了许多有用的类和方法来执行聚合操作。让我们讨论其中的几个。
1.1. Stream.max()和Stream.min()
该Stream
接口提供了两种方法max()
,min()
它们从底层流中返回最大和最小的项目。
如果我们想要项目之间的自定义Comparator
比较逻辑,这两种方法都可以采用自定义实例。
对于基础数据类型,我们有IntStream
、LongStream
和DoubleStream
来支持流项上的顺序和并行聚合操作。我们可以使用该java.util.Arrays.stream()
方法将数组转换为 Stream,然后对其执行任何类型的操作。
int max = Arrays.stream(items).max().getAsInt(); // 100 int min = Arrays.stream(items).min().getAsInt(); // 0
1.2. IntStream.summaryStatistics()
在上面的示例中,我们通过两个单独的步骤找到数组的最大和最小项。我们创建流两次并对其进行两次操作。当我们只需要找到最大项或最小项时,这很有用。
如果我们必须找到最大和最小项,那么在一次迭代中从数组中获取最大和最小项是完全有意义的。我们可以使用IntSummaryStatistics
实例来做到这一点。LongStream和DoubleStream也有类似的实例。
IntSummaryStatistics stats = Arrays.stream(items).summaryStatistics(); stats.getMax(); //100 stats.getMin(); //0
2. Collections.min()和Collections.max()
该类Collections
提供集合中项目的聚合操作,例如List。我们可以将数组转换为列表,并使用这些 API 来查找最大和最小项目。
在给定的示例中,我们将 int[] 转换为 Integer[]。如果您已经有一个 Object[],那么您可以直接将数组传递给Arrays.asList()
API。
Integer min = Collections.min(Arrays.asList(ArrayUtils.toObject(items))); Integer max = Collections.max(Arrays.asList(ArrayUtils.toObject(items)));
3. 对数组进行排序
对于小型数组来说,对数组进行排序也是一个好方法。对于大型数组,排序可能会带来性能问题,因此请明智地选择。
在排序数组中,最小和最大项将位于数组的开头和结尾。
Arrays.sort(items); max = items[items.length - 1]; //100 min = items[0]; //0
4. 迭代数组
这是最基本的解决方案,伪代码是:
使用数组中的第一项初始化 max 和 min 从第二个位置(索引 1)迭代数组 将 第 i 项与 max 和 min 进行比较 如果当前项大于 max 设置 max = 当前项 否则如果当前项低于 min 设置 min = 当前项目
循环结束后,max
和min
变量将引用数组中最大和最小的项。
max = items[0]; min = items[0]; for (int i = 1; i < items.length; i++) { if (items[i] > max) { max = items[i]; } else if (items[i] < min) { min = items[i]; } } System.out.println(max); //100 System.out.println(min); //0
5. 递归
递归为大尺寸未排序数组提供了更好的性能。请注意,我们正在分别编写最大和最小项目的递归调用。如果我们需要在一次调用中找到这两个项目,我们将需要根据需求更改程序。
这个解决方案基本上是分治算法,我们只处理当前索引和其余结果(递归调用)并将它们合并在一起以获得最终输出。
为了获得最大项目,在每个项目中,我们返回比较中当前项目中较大的一个以及具有更大索引的所有项目。类似的方法是寻找最小项。
min = getMax(items, 0, items[0]); //0 min = getMin(items, 0, items[0]); //100 public static int getMax(final int[] numbers, final int a, final int n) { return a >= numbers.length ? n : Math.max(n, getMax(numbers, a + 1, numbers[a] > n ? numbers[a] : n)); } private static int getMin(final int[] numbers, final int a, final int n) { return a == numbers.length ? n : Math.min(n, getMin(numbers, a + 1, numbers[a] < n ? numbers[a] : n)); }
六,结论
在这个简短的 Java 教程中,我们学习了在 Java 中从数组中查找最大和最小元素的不同方法。我们学习了如何使用 Stream API、Collections API、简单迭代以及递归等高级技术。
对于较小的数组,我们应该更注重代码的可读性并使用 Stream 或 Collection API。对于大型数组,我们可以考虑使用递归来获得显着的性能提升。