当前位置: 首页 > news >正文

Java中的sort()排序详解

  排序是编程中最常见的操作之一,无论是对数组、集合,还是对自定义对象,都会遇到排序需求。Java 提供了多种排序方法,涵盖基础数组排序、集合排序,以及自定义排序规则。本文将系统介绍 Java 中 sort() 的多种用法,深入讲解排序原理、代码示例与实战技巧。

首先需要明确的是:sort 方法定义如下(Java 8 中 List 接口):

void sort(Comparator<? super E> c);

其中 Comparator 是一个函数式接口,它只有一个抽象方法:

int compare(T o1, T o2);

 其中对于compare

  • T:是要比较的对象类型(例如 String, Integer, Person 等)

  • o1o2:是要进行比较的两个对象

  • 返回值是一个整数,用于表示它们的大小关系:

  • 小于0:升序,大于0:降序

返回值含义
< 0(负数)o1 小于 o2(o1 排在前面)
= 0(零)o1 等于 o2(不影响顺序)
> 0(正数)o1 大于 o2(o2 排在前面)

一、数组排序:Arrays.sort()

Java 的 Arrays.sort() 是对数组进行排序的基础方法,适用于基本数据类型数组和对象数组。

1. 基本数据类型数组排序

对整型、浮点型、字符型数组进行排序,只需调用:

int[] nums = {5, 3, 8, 1, 4};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));  // 输出:[1, 3, 4, 5, 8]

该方法内部对原始类型数组采用的是基于双枢轴快速排序(Dual-Pivot Quicksort),平均时间复杂度为 O(n log n),性能优良。

2. 对象数组排序

对于对象数组,如 String[],默认按自然顺序(字典序)排序:

String[] fruits = {"Banana", "Apple", "Orange"};
Arrays.sort(fruits);
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]

3. 自定义排序规则

如果需要基于某种业务逻辑排序,比如字符串长度,可以传入 Comparator

Arrays.sort(fruits, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]

 这里使用了 Lambda 表达式,等价于实现 Comparator<String> 的匿名类。

二、集合排序:Collections.sort()List.sort()

1. Collections.sort() 简介

Java 集合框架中的 Collections.sort() 方法用于对 List 进行排序。其底层实现调用了 List 自身的 sort() 方法。

List<Integer> list = Arrays.asList(5, 2, 7, 1);
Collections.sort(list);
System.out.println(list);  // 输出:[1, 2, 5, 7]

2. 自定义排序规则

同样支持传入 Comparator 来实现复杂排序逻辑:

Collections.sort(list, (a, b) -> b - a);
System.out.println(list);  // 输出:[7, 5, 2, 1]

3. Java 8+ 推荐使用 List.sort()

Java 8 引入了 List 接口的 sort() 方法,支持直接用 Lambda 表达式,代码更简洁:

list.sort(Integer::compareTo);  // 升序
list.sort(Comparator.reverseOrder());  // 降序

http://www.dtcms.com/a/311876.html

相关文章:

  • STM32CubeIDE新建项目过程记录备忘(五)中断方式的USART串口通信
  • 浏览器的全局焦点事件
  • 内循环全部满足条件后,为true
  • 大型地面光伏电站开发建设流程
  • IO流-字节流
  • c++--模板--实例化
  • ARM处理器概述及对比
  • 2025熵密杯 -- 初始谜题 -- Reproducibility
  • 基于落霞归雁思维框架的应用与实践研究
  • 计数组合学7.11(RSK算法)
  • Android动画实现控件形状、大小逐渐过渡
  • 智能制造——解读CMMM评估手册【附全文阅读】
  • DyWA:用于可推广的非抓握操作的动态自适应世界动作模型
  • 硅基计划3.0 学习总结 伍 优先级队列排序初识
  • 【Vue3】Class绑定:从基础到高级的完整指南
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • 【完结篇】华为OpenStack架构学习9篇 连载—— 09 OpenStack编排管理【附全文阅读】
  • 深入 Go 底层原理(三):Goroutine 的调度策略
  • OSPF综合
  • VS Code高效开发指南:快捷键与配置优化详解
  • 深入 Go 底层原理(十二):map 的实现与哈希冲突
  • Mybatis学习之获取参数值(四)
  • 字符串(java不死)
  • c++之基础B(进制转换)(第三课)
  • 详解Python标准库之并发执行
  • AI Agent开发学习系列 - LangGraph(3): 有多个输入的Graph
  • C#多数据库批量执行脚本工具
  • OneCode3.0 核心表达式技术深度剖析:从架构设计到动态扩展
  • 波士顿咨询校招面试轮次及应对策略解析
  • 双机并联无功环流抑制虚拟阻抗VSG控制【simulink仿真模型实现】