Java 查询最大最小值 详解

news/2024/11/25 11:37:48/

在 Java 中,查询最大值和最小值是常见需求。以下将详细介绍 最大值和最小值的查询方法,包括适用于数组、集合、以及更复杂的数据结构的解决方案。


1. 使用 Math 类

Java 提供了 Math.maxMath.min 方法,可用于直接比较两个值。

适用场景

  • 比较两个或少量的值。

示例代码

java">public class MaxMinWithMath {public static void main(String[] args) {int a = 5, b = 10;System.out.println("最大值: " + Math.max(a, b)); // 输出 10System.out.println("最小值: " + Math.min(a, b)); // 输出 5double x = 2.5, y = 7.8;System.out.println("最大值: " + Math.max(x, y)); // 输出 7.8System.out.println("最小值: " + Math.min(x, y)); // 输出 2.5}
}

优点

  • 简单易用。

缺点

  • 只能比较两个值,处理数组或集合需要嵌套调用。

2. 遍历法(适用于数组)

通过遍历数组,可以找到其最大值和最小值。这是最常见的算法

适用场景

  • 查询数组的最大值和最小值。

示例代码

java">public class MaxMinInArray {public static void main(String[] args) {int[] nums = {3, 7, 2, 9, 4};int max = nums[0]; // 假设第一个值为最大值int min = nums[0]; // 假设第一个值为最小值for (int num : nums) {if (num > max) max = num; // 更新最大值if (num < min) min = num; // 更新最小值}System.out.println("最大值: " + max); // 输出 9System.out.println("最小值: " + min); // 输出 2}
}

优点

  • 简单高效,时间复杂度为 O ( n ) O(n) O(n)

缺点

  • 手动实现逻辑,代码量略多。

3. 使用 Arrays 类

Java 的 java.util.Arrays 提供了对数组操作的工具,可以通过排序找到最大值和最小值。

适用场景

  • 数组可以被排序且不介意改变原数组。

示例代码

java">import java.util.Arrays;public class MaxMinUsingArrays {public static void main(String[] args) {int[] nums = {3, 7, 2, 9, 4};Arrays.sort(nums); // 对数组进行排序int min = nums[0]; // 第一个元素是最小值int max = nums[nums.length - 1]; // 最后一个元素是最大值System.out.println("最大值: " + max); // 输出 9System.out.println("最小值: " + min); // 输出 2}
}

优点

  • 简洁。

缺点

  • 排序的时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),比简单遍历慢。
  • 改变了原数组顺序。

4. 使用 Collections 类

java.util.Collections 提供了对集合操作的工具方法,可轻松找到 List 的最大值和最小值。

适用场景

  • 操作 List 类型的集合。

示例代码

java">import java.util.Collections;
import java.util.Arrays;
import java.util.List;public class MaxMinUsingCollections {public static void main(String[] args) {List<Integer> nums = Arrays.asList(3, 7, 2, 9, 4);int max = Collections.max(nums); // 找最大值int min = Collections.min(nums); // 找最小值System.out.println("最大值: " + max); // 输出 9System.out.println("最小值: " + min); // 输出 2}
}

优点

  • 简洁,操作简单。
  • 不需要手动实现遍历逻辑。

缺点

  • 仅适用于 List 类型的数据。

5. 使用 Java Streams

Java 8 引入了 Streams API,可用于高效查询最大值和最小值。

适用场景

  • 操作数组或集合时,需要更简洁的代码。

示例代码:数组

java">import java.util.stream.IntStream;public class MaxMinWithStreams {public static void main(String[] args) {int[] nums = {3, 7, 2, 9, 4};int max = IntStream.of(nums).max().orElse(Integer.MIN_VALUE);int min = IntStream.of(nums).min().orElse(Integer.MAX_VALUE);System.out.println("最大值: " + max); // 输出 9System.out.println("最小值: " + min); // 输出 2}
}

示例代码:集合

java">import java.util.Arrays;
import java.util.List;public class MaxMinInListStreams {public static void main(String[] args) {List<Integer> nums = Arrays.asList(3, 7, 2, 9, 4);int max = nums.stream().max(Integer::compareTo).orElse(Integer.MIN_VALUE);int min = nums.stream().min(Integer::compareTo).orElse(Integer.MAX_VALUE);System.out.println("最大值: " + max); // 输出 9System.out.println("最小值: " + min); // 输出 2}
}

优点

  • 支持并行流操作,处理大规模数据时效率更高。
  • 更加现代化和简洁。

缺点

  • 需要掌握 Streams API 的用法。

6. 应对特殊情况

(1) 空数组或集合

  • 如果数组或集合为空,查询最大最小值会抛出异常,需特别处理。
  • 使用 OptionalorElse 提供默认值。
示例代码
java">import java.util.OptionalInt;public class HandleEmptyArray {public static void main(String[] args) {int[] nums = {};int max = IntStream.of(nums).max().orElse(Integer.MIN_VALUE); // 默认值int min = IntStream.of(nums).min().orElse(Integer.MAX_VALUE); // 默认值System.out.println("最大值: " + max); // 输出 Integer.MIN_VALUESystem.out.println("最小值: " + min); // 输出 Integer.MAX_VALUE}
}

(2) 所有值相等

当所有值相等时,最大值和最小值相等。

示例代码
java">int[] nums = {5, 5, 5, 5};int max = IntStream.of(nums).max().orElse(Integer.MIN_VALUE);
int min = IntStream.of(nums).min().orElse(Integer.MAX_VALUE);System.out.println("最大值: " + max); // 输出 5
System.out.println("最小值: " + min); // 输出 5

7. 方法对比

方法优点缺点
Math.max / Math.min简单直接,适合少量数字比较无法直接处理数组或集合
遍历法高效( O ( n ) O(n) O(n)),适合数组需要手动实现逻辑
Arrays.sort简洁,适合小型数组修改原数组,效率低于遍历法
Collections.max / min简洁,专为 List 提供不支持数组,需先转换为 List
Streams现代化、支持并行流写法较复杂,依赖 Java 8 及以上版本

8. 总结

  1. 少量值的比较:使用 Math.maxMath.min
  2. 数组的最大最小值
    • 使用 遍历法(高效)。
    • Streams API(简洁)。
  3. 集合的最大最小值
    • 使用 Collections.max/minStreams API
  4. 大规模数据
    • 优先使用 Streams 并行流,能充分利用多核性能。

选择合适的方法可以提升代码的可读性和性能。


http://www.ppmy.cn/news/1549810.html

相关文章

VELO SkyOW+坐垫,一起Cityride温暖你的上海之旅

随着冬季的到来&#xff0c;上海的街头巷尾弥漫着一种独特的浪漫气息&#xff0c;当金黄的落叶从空中飘落&#xff0c;铺满路边&#xff0c;只是路过就仿佛骑进了一幅世界名画。无论是沿着外滩漫游&#xff0c;还是穿行在浦东的高楼间&#xff0c;骑行的方式总能让你充分体验到…

@EnableConfigurationProperties @ConfigurationProperties

EnableConfigurationProperties && ConfigurationProperties的使用时机 今天在写properties时想到了这个问题&#xff0c;为什么有时候我需要写EnableConfigurationProperties有时候又不需要呢&#xff1f;下面就详细讲讲。 Data Component ConfigurationProperties(pr…

关于图论建模的一份介绍

图论是离散数学的一部分&#xff0c;主要研究点与线所组成的形状。不过它们并非与几何中的图形类似&#xff0c;而是一种抽象化的产物&#xff0c;因此&#xff0c;我们可以通过这种方式来将一些生活、生产等中的问题进行建模&#xff0c;然后用数学规划等方式解决。所以&#…

docker学习笔记跟常用命令总结

Docker简介 Docker是一个用于构建运行传送应用程序的平台 镜像 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜 镜像结构 镜像管理命令 命令说明docker pull拉取镜像docker push推送镜像docker images查看本地镜像docker rmi删除本地镜像docker image prune…

LLMops产品介绍

文章目录 字节跳动的扣子优点低代码开发丰富的插件与能力扩展强大的记忆与数据交互能力应用场景广泛 不足模型选择相对受限定制化程度受限输出效果有待提高应用部署范围有限市场认知度和用户基础不足 开悟大模型运营管理系统&#xff08;LLMOPS&#xff09;优点全生命周期管理降…

初识线程池

目录 初识线程池为什么要引入线程池标准库中的线程池代码演示创建线程池的时候&#xff0c;设置多少个线程合适&#xff1f;&#xff1f; 初识线程池 池 是一个非常重要的概念 你可能听说过 池化技术 常量池、数据库连接池、线程池、进程池、内存池… 为什么要引入线程池 最开…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

设计模式——前端控制器模式

定义与概念 前端控制器模式&#xff08;Front Controller Pattern&#xff09;是一种软件设计模式&#xff0c;主要用于集中处理 Web 应用或其他多层架构应用的请求。它作为一个单一的入口点来接收和处理所有的客户端请求&#xff0c;将请求分发给相应的处理模块&#xff0c;从…