一篇文章搞定Java中常用集合的排序方法

news2024/11/28 14:12:19

目录

Array · 数组

List · 列表

Collections.sort()

简单类型

复杂对象

使用Lambda表达式

Stream API

Map · 键值对

对 Map 的 Key 进行排序

对 Map 的 Value 进行排序


最近在做算法题的时候,发现排序在大部分题中都不可或缺,今天心血来潮,总结下Java中集合排序常用的方法,基本覆盖了大部分的排序场景(特别是自定义比较器,太好用叻( ̄▽ ̄)/)

文中提到的自然顺序排序,对于可比较大小的数据类型,一般按照从小到大的顺序,无法比较大小的,一般指按字典序升序排列

Array · 数组

使用Arrays.sort()方法对数组进行排序

int[] arr = {1, 5, 2, 1, 4};
System.out.println("排序前:"+Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));

List · 列表

Collections.sort()

简单类型

使用Collections.sort()方法对List进行排序,可以对List进行原地排序(也就是不创建新的List对象),如下所示

List<String> list = new ArrayList<>();
list.add("b");
list.add("d");
list.add("ca");
list.add("da");
System.out.println("排序前:"+list);
Collections.sort(list);
System.out.println("排序后:"+list);

复杂对象

当List中的对象比较复杂,当默认的排序无法满足需求的时候,可以使用Comparator接口,Comparator可以进行自定义的比较逻辑来控制排序方式

List<Person> list = new ArrayList<>();
list.add(new Person("李四1", 19));
list.add(new Person("李四2", 29));
list.add(new Person("李四3", 39));
list.add(new Person("李四4", 49));
list.add(new Person("张三1", 59));
list.add(new Person("张三2", 69));
list.add(new Person("张三3", 79));
list.add(new Person("张三4", 89));
System.out.println("按名字排序前:" + list);
Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        //按名字排序
        return o1.getName().compareTo(o2.getName());
    }
});
System.out.println("按名字排序后:" + list);

System.out.println("按年龄排序前:" + list);
Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
});
System.out.println("按年龄排序后:" + list);

可以使用Comparable接口进行自然排序 如果有一个类需要排序,可以让改类实现Comparable接口,并实现其compareTo()方法,这样,当要对这个类的对象进行排序时,就可以直接使用Collections.sort()方法

List<Person> list = new ArrayList<>();
list.add(new Person("李四1", 19));
list.add(new Person("李四2", 29));
list.add(new Person("李四3", 39));
list.add(new Person("李四4", 49));
list.add(new Person("张三1", 59));
list.add(new Person("张三2", 69));
list.add(new Person("张三3", 79));
list.add(new Person("张三4", 89));
System.out.println("按年龄排序前:" + list);
Collections.sort(list);
System.out.println("按年龄排序后:" + list);

static class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "[" + name + "," + age + "]";
    }

    @Override
    public int compareTo(Person o) {
        return Integer.compare(this.getAge(), o.getAge());
    }
}

使用Lambda表达式

list.sort((o1, o2) -> o1.compareTo(o2));

Stream API

使用Stream API排序,Java 8还引入了Stream API,它提供了一种流式操作的方式来处理集合数据,Stream API也可以用于对List进行排序

List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());

Map · 键值对

对 Map 的 Key 进行排序

可以使用 TreeMap 来对 Map 的 Key 排序,TreeMap 是有序的保证,底层采用红黑树实现 可以通过比较器 Comparator 对键进行排序,如果没有指定比较器,则按照键自然顺序排序

Map<String, Integer> map = new HashMap<>();
map.put("c", 3);
map.put("a", 1);
map.put("b", 2);

Map<String, Integer> treeMap = new TreeMap<>(map);
System.out.println(treeMap);

对 Map 的 Value 进行排序

可以先将 Map 转换成 List,再对 List 进行排序即可 在转换过程中,我们可以使用 Map.Entry 类型的元素来表示键值对,然后将该元素添加到 List 中

Map<String, Integer> map = new HashMap<>();
map.put("c", 3);
map.put("a", 1);
map.put("b", 2);


List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {

    @Override
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
        return Integer.compare(o1.getValue(), o2.getValue());
    }
});

// 输出排序后的结果
for (Map.Entry<String, Integer> entry : entryList) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

Map<String, Person> map2 = new HashMap<>();
map2.put("c", new Person("Tom", 18));
map2.put("a", new Person("Jerry", 20));
map2.put("b", new Person("Alice", 16));

// 将 Map 的 Entry 转换为 List,并按年龄升序排列
List<Map.Entry<String, Person>> list2 = new ArrayList<>(map2.entrySet());
list2.sort((o1, o2) ->
    Integer.compare(o1.getValue().getAge(), o2.getValue().getAge()));

// 输出排序后的结果
for (Map.Entry<String, Person> entry : list2) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

搞定、撒个花( ̄∇ ̄)/🎉~~~~~~~~~~

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

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

相关文章

Vue配置proxy代理,但接口报错2007 bad domain

1、排查proxy代理配置是否有误 排查 proxyTable 对象中配置的 target 是否正确。若正确&#xff0c;那可能就是请求头的问题。 无特殊配置的情况下&#xff0c;请求头是这样子的&#xff1a; Host 和 Referer 是本地地址&#xff0c;如果后端增加 CSRF 防御机制&#xff0c;…

【JDBC:连接MySQL数据库】出现SQL注入的解决办法、什么时候需要使用SQL注入、事务的使用、悲观锁乐观锁

JDBC JDBC是什么&#xff1f; Java Database Connectivity&#xff08;java语言连接数据库&#xff09; java.sql.*;&#xff08;这个包下有很多接口&#xff09; JDBC的本质是什么&#xff1f; JDBC的本质是SUN公司制定的一套接口&#xff08;interface&#xff09; 接口都有…

【C语言】数据以及位运算

位和位运算 C语言中数据的表示方法各种数据类型可表示的数值范围位和CHAR_BITsizeof运算符整型的内部表示无符号整数的内部表示有符号整数的内部表示 位运算位运算符位与运算位或运算位异或运算位取反运算位左移运算符位右移运算符逻辑位移与算术位移 C语言中数据的表示方法 各…

HCIA-RS实验-路由配置-OSPF 单区域配置

OSPF&#xff08;Open Shortest Path First&#xff09;是一种基于链路状态的路由协议&#xff0c;常用于大型企业网络中。在一个单区域的OSPF网络中&#xff0c;所有的路由器都属于同一个区域&#xff0c;这种配置方式相对简单直观。本文将介绍OSPF单区域的配置方法。 这篇文章…

Vultr 简介和域名购买

1. 网络地址 Vultr: https://my.vultr.com/ Namecheap: Namecheap.com • Login 2. Vultr 简介&#xff1a; Vultr是一家知名的云计算服务提供商&#xff0c;成立于2014年&#xff0c;总部位于美国新泽西州。Vultr提供高性能的云服务器、存储、网络和应用服务&#xff0c;以…

如何把低像素图片转成高清,分享四个方法给大家!

当图片的像素较低时&#xff0c;通常会导致图片模糊不清。然而&#xff0c;我们可以采取一些方法来将低像素图片转变为高清。下面我将介绍几种简单易用的方法&#xff0c;帮助您快速提高照片的分辨率&#xff0c;还原照片的清晰度&#xff01; 方法一&#xff1a;记灵在线工具…

【attention|Tensorformer】从attention走向Transformer

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 概括 说明&#xff1a; 后续增补 1. 正文 1.0 通俗理解 人类视觉的注意力&#xff0c;简单说就第一眼会注意在一幅图像的重要位置上。 而在程序中&am…

vim实用功能汇总

文章目录 1. 读代码1.1 vim中文件跳转1.2 语法高亮模式1.3 Visual 模式 2. 配置vim成为python的IDE 1. 读代码 1.1 vim中文件跳转 vim中文件跳转 这个其实不是靠什么插件完成的&#xff0c;而是vim编辑器自带的功能把光标放在要跳转的文件上&#xff0c;按下gf&#xff0c;即…

YOLOv5改进系列(7)——添加SimAM注意力机制

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

delete 清空表之后,磁盘空间未发生变化?

上篇文章结尾和小伙伴们留了一个小问题&#xff0c;就是关于 optimize table 命令&#xff0c;今天我想花点时间再来和小伙伴们聊一聊这个话题。 1. 删除空洞 1.1 案例展示 首先我们先来看这样一个例子。 我现在有一个名为 sakila 的数据库&#xff0c;该库中有一个 film 表…

C++轻量级跨平台桌面GUI库FLTK的简单使用

C的跨平台桌面GUI库有很多&#xff0c;大体上分成两种流派&#xff1a;retained mode和retained mode。 其中前者是主流的桌面GUI机制框架&#xff0c;包括&#xff1a;Qt、wxwidgets、gtk、juce等后者是一些游戏引擎编辑器常用的GUI机制框架&#xff0c;包括&#xff1a;imgu…

C#常见技能_数组

前几天一个学员在学习C#与数组交互时,也不知道数组可以用来做什么 。下面我们就详细讲讲C# 和数组交互的相关知识。 在C#编程中&#xff0c;数组是一种非常重要的数据结构&#xff0c;它可以存储多个相同类型的数据&#xff0c;并且使用索引来访问这些数据。在实际应用中&…

5.2.7 因特网控制报文协议ICMP

5.2.7 因特网控制报文协议ICMP 我们知道因特网的技术核心是IP数据报&#xff0c;IP数据报的最大特点是无连接不可靠&#xff0c;但实际中因特网中也会存在通信线路或者是处理器的故障、路由器拥塞等等使得无法接收或者处理数据报&#xff0c;路由表也误导导致出现路由环路等原…

微软MFC技术运行机制

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下微软MFC技术运行机制。 很多初学者误以为VC开发必须使用MFC&#xff0c;其实不一定的。MFC的使用只能是提高程序在某些情况下的开发效率&#xff0c;而不能替代整个Win32程序设计。我认为我们有…

python grpc使用示例

1. grpc简介 1.1 概述 gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中&#xff0c;客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法&#xff0c;就像它是本地对象一样&#xff0c;可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样&#xff0c;gR…

AI绘画MidJourney 酷炫艺术风格效果,总有一款你喜欢

文 / 高扬 今天六一儿童节&#xff0c;祝各位大朋友节日快乐。 这次以儿童为主题&#xff0c;看看MidJourney的绘画风格&#xff0c;在这里&#xff0c;我使用的默认V5.1版本。 图画场景是一个男孩和一个女孩在田野玩耍&#xff0c;对应的英文是&#xff1a;A boy and a girl a…

使用PyQT实现模拟表盘时钟的显示效果

代码 class clockThread(QThread):update_ui_signal pyqtSignal(str)def __init__(self, window):super(clockThread, self).__init__()# 信号绑定槽函数self.update_ui_signal.connect(self.draw_time)self.hour 0self.minute 0self.second 0self.window windowself.win…

数据结构与算法·第6章【树】

基本操作 树的相关定义 树的深度&#xff08;高度&#xff09;&#xff1a;树中叶子结点所在的最大层次 森林&#xff1a; m m m棵互不相交的树的集合 二叉树 二叉树或为空树&#xff0c;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。 性质 二…

JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各…

企业邮箱如何设置邮件审核

有的时候对外给客户或合作伙伴等发送邮件需要领导审核后再发&#xff0c;以前都是先发给领导&#xff0c;领导审核以后再重新发给客户&#xff0c; 这样的流程太过繁琐。 新的邮件审核功能既能满足审核需求&#xff0c;又避免了重复发信&#xff0c;可以极大提高工作效率。 设…