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

一、简介

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() 并不保证在这种情况下使用插入排序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA-AXI4接口协议概述

假设我们要传一帧1080P的图片到显示屏显示&#xff0c;那么需要多大的储存空间呢&#xff1f; 一帧1080P的RGB565图像数据需要1920*1080*1633.1776Mb 存储空间 下图是ZYNQ-7000系列中Block RAM的大小&#xff1a; 可以看到最大存储空间的BRAM都不能存储一帧图片&#xff0c;那…

Turbo C++ v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)·跟老吕学C语言(C语言必学教程之一)

[TOC](Turbo C v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)) 跟老吕学C语言&#xff08;C语言必学教程之一&#xff09; 老吕是通过 Turbo C 编译器开始了 C 编程培训和开发。 本文中&#xff0c;老吕将带你了解如何下载 Turbo C&#xff0c;如何在任何最新 W…

十堰网站建设公司华想科技具有10年的网站制作经验

2018年已经结束了。 华翔科技收到了很多客户的咨询&#xff0c;他们都有一个共同的问题&#xff1a;建一个网站需要多少钱&#xff1f; 但是&#xff0c;我们都会问&#xff1a;您有什么具体需求吗&#xff1f; 大多数人的答案是否定的&#xff0c;他们只是想打听一下价格。 十…

学习JAVA的第十九天(基础)

目录 File 成员方法&#xff08;判断和获取&#xff09; 成员方法&#xff08;创建和删除&#xff09; 成员方法&#xff08;获取并遍历&#xff09; IO流 FileOutputStream FileInputStream 文件拷贝 前言&#xff1a;学习JAVA的第十八天&#xff08;基础&#xff09;…

一文读懂:公网IP地址证书

公网IP证书是一种SSL证书&#xff0c;用于验证和确认特定的公网IP地址是否实际属于申请者。如果验证通过&#xff0c;证书颁发机构将向该IP地址持有人颁发一个以IP地址为主题的SSL证书。使用公网IP证书可以有效提升IP身份的辨识度&#xff0c;减少网站链接被假冒的风险&#xf…

办公技巧分享:如何更新二维码的内容,并重新设计二维码样式?

怎样修改已经打印&#xff08;或发布&#xff09;的二维码的内容&#xff1f;还有能不能重新设计二维码的样子、颜色&#xff1f;即使二维码已经发布了&#xff0c;打印了。 其实&#xff0c;这都很容易实现。 今天的这篇教程就来详细说明如何更新二维码的内容&#xff1f;以…

这个简历你给几分?

求大家给给建议&#x1f62d;&#x1f62d; 自己算法几乎没刷过&#xff0c;项目也不咋好 打算21号开始投日常实习 好慌

Day31-计算机基础1

Day31-计算机基础1 1. 网络基础介绍1.1 什么是网络&#xff1f;1.2 为什么要有网络&#xff1f;1.3 运维人员需要学习哪些网络知识&#xff1f;1.4 按作用范围对网络分类 2.网络设备知识2.1 网络传输介质及传输信号2.2 网卡设备2.3 中继器&#xff08;RP repeater&#xff09;2…

labview的常用小技巧

1.切换&#xff1a;labview中控件函数与函数选板的使用非常频繁&#xff0c;而使用菜单来调用他们非常不方便。最简单的调用方法是&#xff1a;右击前面板&#xff0c;弹出控件选板&#xff1b;右击程序框图&#xff0c;弹出函数选板。然后按住CtrlE组合键&#xff0c;即可快速…

#QT(QString)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 4.代码

Unity之PUN实现多人联机射击游戏的优化

目录 &#x1f3ae;一、 跳跃&#xff0c;加速跑 &#x1f3ae;二、玩家自定义输入昵称 &#x1f345;2.1 给昵称赋值 &#x1f345;2.2 实现 &#x1f3ae;三、玩家昵称同步到房间列表 &#x1f345;3.1 获取全部玩家 &#x1f345;3.2 自定义Player中的字段 &#…

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

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

是什么样的父母才是真正内心最强

真正的内心强者&#xff1a;育子之道 在这个世界上&#xff0c;每个人都在追求内心的强大&#xff0c;而真正的内心强者往往是那些在育子之道上执着前行的父母。他们用自己的智慧和爱心&#xff0c;培养出独立、自信、有责任感的孩子&#xff0c;同时也锻造了自己的内心力量。…

第十一届“图灵杯“NEUQ-ACM程序设计竞赛-H(卷王)

思路&#xff1a;二分加爬树&#xff08;本人较为满意&#xff09; #include <bits/stdc.h>#define endl \n using ll long long; typedef unsigned long long ull; using namespace std;void GordenGhost();signed main() { #ifdef Gordenfreopen("in.txt",…

Win11用户必看:Win11 24H2版本更新教程!

随着Win11系统的不断更新&#xff0c;24H2版本带来了许多令人期待的新功能和优化。为了帮助您顺利完成更新&#xff0c;小编给您提供了详细的更新教程。按照本文的步骤进行操作&#xff0c;您将能够轻松完成Win11 24H2版本的更新&#xff0c;并享受全新的系统体验。 Win11 24H2…

助力头部银行10倍提升数据化运营效率,NoETL的破局之道丨爱分析活动

在数字化飞速发展的今天&#xff0c;企业经营者们逐渐认识到数据平台对于企业生产经营所不可或缺的价值。随着数据平台不断发展和进化&#xff0c;数据量、数据源、用数人群也日益增加&#xff0c;对于业务用数敏捷和数据管理有序同样带来了全新的挑战。数据应用层面&#xff0…

[Flutter]自定义等待转圈和Toast提示

1.自定义样式 2.自定义LoadingView import package:flutter/material.dart;enum LoadingStyle {onlyIndicator, // 仅一个转圈等待roundedRectangle, // 添加一个圆角矩形当背景maskingOperation, // 添加一个背景蒙层&#xff0c; 阻止用户操作 }class LoadingView {static f…

CleanMyMac X 4.14.1中文版功能介绍及激活入口

细心的用户发现苹果Mac电脑越用越慢&#xff0c;其实这种情况是正常的&#xff0c;mac电脑用久了会产生很多的缓存文件&#xff0c;如果不及时清理会影响运行速度。macbook就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的…

C++动态二维数组vector<vector<T>>详细讲解

前言 在本文章中&#xff0c;我们将要详细介绍一下C中vector关于动态二维数组vector<vector>。 一、杨辉三角的引入 我们在介绍动态二维数组之前&#xff0c;先来看一下这道题目 在本题目中&#xff0c;我们很容易发现规律&#xff0c;两边数据为1,剩下的按照一定的规…

Dynamo程序添加到Revit工具栏(懒人版)

你是不是想将Dynamo写好的程序添加到Revit工具栏&#xff1f; 你是否还在因为Dyno Browser配置起来太复杂而烦恼&#xff1f; 你是否因为Dynamo不同版本&#xff0c;无法单独配置工具栏而发愁&#xff1f; 今天九哥来给大家弄了一个更简单的工具&#xff0c;是拿网上开源的工…