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

在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;
	}
	// 方便输出观察
	@override
	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 降序排列, 实现降序只需加负号即可
		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);
```
相关推荐
就叫_这个吧3 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡3 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管3 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅3 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒3 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰4 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
今天AI了吗5 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5215 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing5 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习6 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展