【JAVA】Collections.sort()方法详解

news2024/11/18 13:31:57

一、简介

Collections.sort() 是 Java 集合框架(Java Collections Framework)中的一个静态方法,用于对列表(List)中的元素进行排序。此方法利用了 Java 的泛型机制,可以很方便地对各种类型的列表进行排序。

  • 源码方法体:
    在这里插入图片描述
  • 参数 list:需要排序的列表。列表中的元素必须实现了 Comparable 接口,以便能够比较它们的大小。

二、使用示例

1、普通使用

假设你有一个 Integer 类型的列表,你可以使用 Collections.sort() 方法对它进行排序:

	import java.util.ArrayList;  
	import java.util.Collections;  
	import java.util.List;  
	  
	public class SortExample {  
	    public static void main(String[] args) {  
	        List<Integer> numbers = new ArrayList<>();  
	        numbers.add(3);  
	        numbers.add(1);  
	        numbers.add(4);  
	        numbers.add(1);  
	        numbers.add(5);  
	        numbers.add(9);  
	        numbers.add(2);  
	        numbers.add(6);  
	        numbers.add(5);  
	        numbers.add(3);  
	        numbers.add(5);  
	  
	        System.out.println("Before sorting:");  
	        for (int number : numbers) {  
	            System.out.print(number + " ");  
	        }  
	        System.out.println();  
	  
	        Collections.sort(numbers);  
	  
	        System.out.println("After sorting:");  
	        for (int number : numbers) {  
	            System.out.print(number + " ");  
	        }  
	    }  
	}
输出:
	Before sorting:  
	3 1 4 1 5 9 2 6 5 3 5   
	After sorting:  
	1 1 2 3 3 4 5 5 5 6 9

2、进阶示例

如果列表中的元素没有实现 Comparable 接口,你不能直接使用 Collections.sort() 方法的默认版本,因为该方法需要列表中的元素能够相互比较。但是,你可以通过实现 Comparator 接口来定义元素之间的比较逻辑,并使用 Collections.sort() 的另一个版本,它接受一个 Comparator 参数。

Comparator 接口定义了一个 compare(T o1, T o2) 方法,你需要在这个方法中定义如何比较两个元素。

以下是一个示例,展示了如何对一个包含自定义对象的列表进行排序,这些对象没有实现 Comparable 接口:

	public class SortWithComparatorExample {  
	    public static void main(String[] args) {  
	        List<Person> people = new ArrayList<>();  
	        people.add(new Person("Alice", 30));  
	        people.add(new Person("Bob", 20));  
	        people.add(new Person("Charlie", 25));  
	  
	        // 使用自定义的 Comparator 进行排序  
	        Collections.sort(people, new Comparator<Person>() {  
	            @Override  
	            public int compare(Person p1, Person p2) {  
	                // 按照年龄升序排序  
	                return p1.getAge() - p2.getAge();  
	            }  
	        });  
	  
	        // 输出排序后的列表  
	        for (Person person : people) {  
	            System.out.println(person);  
	        }  
	    }  
	}

在上面的代码中,我们定义了一个 Person 类,它包含 nameage 两个属性。我们创建了一个 Person 对象的列表,并使用 Collections.sort() 方法和一个自定义的 Comparator 来按照年龄对列表进行排序。

在Comparator接口的compare方法中,返回值是一个整数,它表示了被比较的两个对象之间的相对顺序。这个返回值遵循以下约定:

  • 如果返回值小于0(通常是负数),则表示第一个对象(o1)应该排在第二个对象(o2)之前。
  • 如果返回值等于0,则表示两个对象是相等的,它们的顺序无关紧要。
  • 如果返回值大于0(通常是正数),则表示第一个对象(o1)应该排在第二个对象(o2)之后。

这个返回值用于构建排序算法中的比较逻辑。排序算法会根据compare方法的返回值来决定列表中元素的最终位置。我们也可以根据对象中的值,通过返回值自己定义排序规则。

注意,在 compare 方法中,我们简单地返回了两个 Person 对象年龄的差值。在实际应用中,你可能需要处理更复杂的比较逻辑,并考虑使用 Integer.compare(int x, int y) 这样的方法来避免整数溢出的问题。

3、 lambda 表达式比较

此外,从 Java 8 开始,你还可以使用 lambda 表达式来更简洁地定义 Comparator:

Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());

或者,使用 List 接口的 sort 方法(如果列表是 ArrayList 或其他支持此方法的列表实现):

people.sort((p1, p2) -> p1.getAge() - p2.getAge());

这些方法都允许你在不修改原始类的情况下对列表进行排序。

三、注意事项

列表中的元素必须实现 Comparable 接口。如果元素没有实现这个接口,那么在调用 Collections.sort() 方法时会抛出 ClassCastException。
Collections.sort() 方法使用了稳定的排序算法,即相等的元素在排序后的列表中的相对顺序与它们在原始列表中的相对顺序相同。
如果需要对列表进行自定义排序(例如,根据对象的某个特定属性进行排序),你可以实现自己的 Comparator,并使用 Collections.sort(List<T> list, Comparator<? super T> c) 方法进行排序。

四、性能

Collections.sort() 方法在内部使用了归并排序或 Timsort 算法,这些算法的时间复杂度通常是 O(n log n),其中 n 是列表中元素的数量。这意味着对于大型列表,排序操作通常是相对高效的。然而,对于非常小的列表,使用插入排序可能会更快,但 Collections.sort() 并不保证在这种情况下使用插入排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优思学院|5S 应该由哪个部门负责推行?

很多人以为5S是生产部的事&#xff0c;负责的部门自然是生产部&#xff0c;事实上这是一个很严重的错误&#xff0c;那么&#xff0c;究竟5S 应该由哪个部门负责推行&#xff1f;我们今天就来讨论一下。如果你喜欢我们的文章&#xff0c;记得点赞和收藏。 5S是全员参与的活动&…

EASY-LASER激光对中仪维修E710镭射仪联轴器维修

Easy-Laser激光对中仪维修常见故障&#xff1a;触摸屏损坏&#xff08;屏碎&#xff0c;不显示&#xff0c;黑屏&#xff0c;蓝屏&#xff0c;无背光等&#xff09;&#xff0c;对中仪电路板损坏&#xff0c;对中仪接收装置电路板维修&#xff0c;对中仪发射控制装置电路板等均…

基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

编程界的圣经:从Scheme到JavaScript构建你的计算思维

文章目录 适读人群目 录 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算机科学技术教育的发…

Paimon新版本核心特性和生产实践解读

最近Apche Paimon发布了最新版本0.7.0&#xff0c;在这个版本中&#xff0c;Paimon对一些新特性进行了增强。 Paimon在数据湖领域发展迅速&#xff0c;未来会在整个数据开发领域占有很重要的地位&#xff0c;今天我们来盘点一下当前能力的特点以及在生产环境中的使用情况。 Loo…

springboot262基于spring boot的小型诊疗预约平台的设计与开发

小型诊疗预约平台 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本小型诊疗预约平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…

选择某个元素的第几个元素

//p标签里面的奇数&#xff08;odd&#xff09;的背景设置为red,event是偶数 p:nth-of-type(odd){background-color: red;}

POS 之 惩罚机制

惩罚 Item描述惩罚机制&#x1f360;来源投票验证者给正确的来源检查点进行了及时投票如果及时投票或投票非常慢&#xff0c;没有奖励&#xff0c;并且会从验证者余额中移同等价值&#x1f35a;目标投票验证者给正确的目标检查点进行了及时投票如果及时投票或投票非常慢&#x…

文心一言 VS 讯飞星火 VS chatgpt (212)-- 算法导论16.1 3题

三、对于活动选择问题&#xff0c;并不是所有贪心方法都能得到最大兼容活动子集。请举例说明&#xff0c;在剩余兼容活动中选择持续时间最短者不能得到最大集。类似地&#xff0c;说明在剩余兼容活动中选择与其他剩余活动重叠最少者&#xff0c;以及选择最早开始者均不能得到最…

购买须知:腾讯云服务器99元一年限制月流量300GB

腾讯云99元服务器限制月流量吗&#xff1f;是的&#xff0c;限制月流量&#xff0c;每月提供300GB月流量&#xff0c;超出部分的流量&#xff0c;需要额外支付流量费&#xff0c;价格为0.8元每GB。可以在腾讯云百科 txy.wiki 查看当前99元服务器详细配置和最新的优惠券信息。如…

Pytorch学习 day10(L1Loss、MSELoss、交叉熵Loss、反向传播)

Loss loss的作用如下&#xff1a; 计算实际输出和真实值之间的差距为我们更新模型提供一定的依据&#xff08;反向传播&#xff09; L1Loss 绝对值损失函数&#xff1a;在每一个batch_size内&#xff0c;求每个输入x和标签y的差的绝对值&#xff0c;最后返回他们平均值 M…

phpcms头像上传漏洞

经典版 漏洞原理&#xff1a;我们上传一个zip的压缩包&#xff0c;它会解压然后删除其中不是.jpg .gig .png的文件 function check_dir($dir)&#xff1a;这是一个PHP函数的定义&#xff0c;它接受一个参数 $dir&#xff0c;代表要检查的目录路径。 $handle opendir($dir);&…

公众号如何获取视频号下载工具?

视频内容已经成为信息传播的重要载体&#xff0c;微信视频号作为国内主流的短视频平台之一&#xff0c;深受用户喜爱。有时我们想要保存喜欢的视频以供日后观看&#xff0c;这时就需要借助一些公众号提供的视频号下载工具。 本文将详细解析如何利用这些工具&#xff0c;让你轻…

OpenText Availability——适用于 Windows 和 Linux 服务器的高可用性和灾难恢复解决方案

OpenText Availability——适用于 Windows 和 Linux 服务器的高可用性和灾难恢复解决方案 连续复制&#xff0c;最大限度地减少数据丢失快速故障转移&#xff0c;最大限度地减少停机时间可忽略的性能影响支持物理、虚拟和基于云的系统平台 停机从多种途径侵扰 IT 企业。 从相…

Mybatis的使用快速入门

1. 数据库准备 假设目前存在以下数据库表。 CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );2. 依赖导入 pom.xml <dependencies><!-- mybatis依赖 --><dependency><groupId>or…

仿牛客网项目---项目总结

本篇文章是对整个项目的一个总结。下面这张图要好好理解。 整个项目都是构建在SpringBoot之上的&#xff0c;所以把它画到最底下&#xff0c;其它技术依托在springboot之上。但是springboot并不是技术的核心&#xff0c;而只是起到了一个辅助的作用&#xff0c;它的作用仅仅是降…

2024自动化测试入门分析!

1、回归到具体的测试本质工作 产品质量很难孤立的去看&#xff0c;不管是自动化测试还是业务测试&#xff0c;最终的目的都是为了产 品质量服务&#xff0c;从而打造很酷很好的产品来赋能客户 测试的工作就是质量管理以及测试效率的提升。质量管理是一个比较大的话题&#x…

项目管理软件:如何确保项目启动顺利?

对所有项目经理来说&#xff0c;了解如何启动项目是最关键的技能之一。项目都是从小事开始&#xff0c;逐渐发展为更大型、更复杂的。好的开始是成功的一半&#xff0c;对项目管理来说更是如此。 启动项目的 10 个简单步骤 即使是最复杂的项目&#xff0c;也可以分解成简单的…

亚马逊、速卖通卖家自养号测评细节需要掌握的哪几点?

亚马逊&#xff0c;跨境电商的巨头&#xff0c;早已成为业界的热门话题。如今&#xff0c;越来越多的卖家渴望在亚马逊的舞台上崭露头角&#xff0c;这也使得市场竞争愈发激烈。在亚马逊的丛林中&#xff0c;Review成为影响卖家命运的关键因素。它不仅影响亚马逊对卖家账号的评…

关于DSP C6678的另一种引导启动方法

之前通过自启动已经将C6678的Core0和Core1都实现了启动。方法在之前的文章里面已经提及&#xff1a; C6678 EMIF NOR FLASH自启动方法-CSDN博客 这种启动方式是Core0和Core1工程里面都加了boot.asm&#xff0c;通过EMIF NOR FLASH特性&#xff0c;每个核自动搬移各个字段&…