Java中按照不同字段进行排序

news/2025/3/17 13:03:58/

在Java中(默认Java8),假设有一个类定义为:

java">class Pair{int a,b;
}

现在有一个Pair列表pairs,其类型为ArrayList<Pair>.
问题:(1)按照a字段从大到小排序并输出
(2)按照b字段从小到大排序并输出
说明:你可以对类进行一定改造,也可以借助库函数、库工具等进行实现。
此外,代码尽可能保持简洁,不要有太多冗余

1. 快速开发示例:Comparator+Lambda表达式

java">import java.util.*;class Pair{int a, b;public Pair(int a, int b){this.a = a;this.b = b;}// 方便输出观察@overridepublic String toString(){return String.format("(%d, %d)", a, b);}
}public class Main{public List<Pair> getPairs(){List<Pair> pairs = new ArrayList<>();// ...}public static void main(String[] args){// 构造一个 pairs 实例List<Pair> pairs = getPairs();// 按照字段 a 降序排列, 实现降序只需加负号即可pairs.sort(Comparator.compareInt(p->-p.a));System.out.println(pairs);pairs.sort(Comparator.compareInt(p->p.b));System.out.println(pairs);}
}

如上述示例所示,通过调用集合框架的sort方法并传入Comparator即可实现按照指定字段的排序,对于int类型,已经有一个Comparator.compareInt可以直接使用,内部使用Lambda表达式指定字段,对于需要降序输出的,添加负号即可。

2. 标准开发示例:Comparator+Getter

通常,按照JavaBean的设计思想,类的字段保持私有,如必要还需要设置为final类型以保证线程安全,对外暴露公共的getter方法,此时代码编写更加规范:

java">import java.util.*;
class Pair{private final int a, b;public Pair(int a, int b){this.a=a;this.b=b;}public int getA(){return a;}public int getB(){return b;}public String toString(){return String.format("(%d,%d)", a, b);}
}
public class Main{public List<Pair> getPairs(){List<Pair> pairs = new ArrayList<>();// ...}public static void main(String[] args){// 构造一个 pairs 实例List<Pair> pairs = getPairs();// 按照字段 a 降序排列, Pair::getA表达式+reversed方法pairs.sort(Comparator.compareInt(Pair::getA).reversed());System.out.println(pairs);// 按照字段 b 升序排列pairs.sort(Comparator.compareInt(Pair::getB));System.out.println(pairs);}
}

3. 若字段a,b为String或者其他的自定义类型(已实现Comparable)

使用更通用的 comparing 方法

java">// 按照 a 降序排列
pairs.sort(Comparator.comparing(Pair::getA).reversed());// 按照 b 升序排列
pairs.sort(Comparator.comparing(Pair::getB));```此处看到getter的好处,在a,b类型变化时,排序代码基本保持不变。### 4. 如何实现 Comparable
假设现在需求并不是通过不同的字段来进行灵活多样的排序,而是结合不同字段实现更复杂的排序行为,此时就需要使用 Comparable 接口,例如通过a+b实现升序排序,或者先通过a进行升序排序,当a相等时通过b升序排序等等,以后者为例,实现代码如下:
```java
import java.util.*;class Pair implements Comparable<Pair>{int a, b;public Pair(int a, int b){this.a = a;this.b = b;}public int compareTo(Pair o){if (this.a==o.a){return this.b-o.b;}return this.a-o.a;}
}
// 排序代码
Collections.sort(pairs);
```

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

相关文章

大模型-提示词调优

什么是提示词 提示词&#xff08;Prompt&#xff09;在大模型应用中扮演着关键角色&#xff0c;它是用户输入给模型的一段文本指令 。简单来说&#xff0c;就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如&#xff0c;当我们想让模型写一篇关于春天的散文&a…

Podman 运行redis 报错

Podman 运行redis 报错 一、报错内容 find: .: Permission denied chown: changing ownership of .: Permission denied二、问题分析 SELinux 模式 SELinux(Security-Enhanced Linux)是一种安全模块,旨在通过强制访问控制(MAC)来增强 Linux 系统的安全性。SELinux 具有…

入门到入土,Java学习 day20(多线程下)

void wait() 当前线程等待&#xff0c;直到被其他线程唤醒 void notify() 随机唤醒单个线程 void notifyAll() 唤醒所有线程 阻塞队列 在测试方法中创建带锁队列&#xff0c;然后在对象类中也创建队列但是不赋值&#xff0c;用构造方法将测试方法中的对象赋值 然后用put和t…

QT编程之HTTP服务端与客户端技术

一、HTTP 服务器实现方案 ‌QtWebApp 集成‌ 将QtWebApp源码的 httpserver 目录导入项目&#xff0c;并在 .pro 文件中添加 include ($$PWD/httpserver/httpserver.pri)‌。配置 WebApp.ini 文件定义服务参数&#xff08;IP、端口、线程池等&#xff09;&#xff0c;通过 HttpL…

MySQL(事物上)

目录 示例&#xff1a; 一 引入事物 1. 概念 2. 事物的4大特性 3. 为什么要有事物&#xff1f; 二 事物操作 1. 查看存储引擎支持的事物 2. 事物的提交方式 2.1 查看事物的默认提交方式 2.2 设置事物的默认提交方式 2.3 查看事物的全局隔离级别 2.4 验证事物的回滚…

MarkDown 输出表格的方法

MarkDown用来输出表格很简单&#xff0c;比Word手搓表格简单多了&#xff0c;而且方便修改。 MarkDown代码&#xff1a; |A|B|C|D| |:-|-:|:-:|-| |1|b|c|d| |2|b|c|d| |3|b|c|d| |4|b|c|d| |5|b|c|d|显示效果&#xff1a; ABCD1bcd2bcd3bcd4bcd5bcd A列强制左对齐&#xf…

用Python打造智能姓名生成器:从数据分离到AI赋能

用Python打造智能姓名生成器&#xff1a;从数据分离到AI赋能 目录 项目概述与功能清单环境准备与工具选择项目架构设计核心代码实现AI古文解析模块交互界面开发使用示例与效果展示扩展思路与优化建议 1. 项目概述与功能清单 核心功能 数据管理 CSV文件存储姓氏/名字库支持用…

【算法】 区间合并(附蓝桥杯真题) python

步骤 1.先将所有区间按左端点排序 2.从前往后扫一遍&#xff0c;维护当前正在合并的区间[st, ed] 3.依次检查每个区间[l, r]&#xff0c; 若 l > ed,将[st, ed]加入 ans , 更新st l,ed r 若 l < ed &#xff0c;更新ed max(ed, r) 时间复杂度 O(nlogn) 模板 https:/…