Java集合的排序操作

本文详细介绍了如何在Java集合工具类Collections中使用sort方法进行自然排序和自定义排序,包括comparable接口的应用、匿名内部类比较器的编写,以及JDK1.8中stream API的高级排序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

在工作中我们常常需要对一些集合进行排序操作,那么我们就可以使用java集合的工具类Collections
来完成相应的操作。这篇文章大概回顾一下具体的使用操作。


java集合的工具类Collections中提供了两种排序的方法,分别是:
Collections.sort(List list) //自然排序
Collections.sort(List list,Comparator c) //自定义排序

2.Collections.sort(List list) 自然排序

自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法。
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Comparable{

    private String name;
    private int age;

    @Override
    public int compareTo(Object o) {
        if(o instanceof User){
            User user = (User) o;
            return this.age - ((User) o).age;
        }
        throw new ClassCastException("不能转换为User类型的对象...");
    }
}
@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22));
	list.add(new User("李四",45));
	list.add(new User("司总",18));

	Collections.sort(list);

	list.forEach(v ->{
		System.out.println(v.toString());
	});
}

输出结果:

User(name=司总, age=18)
User(name=张三, age=22)
User(name=李四, age=45)


注意:
这种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的
属性调用排序方法时,需要反复修改比较。

3.Collections.sort(List list,Comparator c) 自定义排序

需编写匿名内部类,先new一个Comparator接口的比较器,同时实现compare()方法。
@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22));
	list.add(new User("李四",45));
	list.add(new User("司总",18));

	Collections.sort(list, new Comparator<User>() {
		@Override
		public int compare(User o1, User o2) {
			return o2.getAge() - o1.getAge();
		}
	});

	list.forEach(v ->{
		System.out.println(v.toString());
	});
}


输出结果:

User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)

4.JDK1.8更方便排序处理

案例1:Comparator.reverseOrder()反自然排序

@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22));
	list.add(new User("李四",45));
	list.add(new User("司总",18));

	List<User> collect = list.stream().sorted(Comparator.comparing(o -> o.getAge(),Comparator.reverseOrder()))
			.collect(Collectors.toList());
	collect.forEach(v ->{
		System.out.println(v.toString());
	});
}


输出:

User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)
案例2:Comparator.naturalOrder() 自然排序

@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22));
	list.add(new User("李四",45));
	list.add(new User("司总",18));

	List<User> collect = list.stream().sorted(Comparator.comparing(o -> o.getAge(),Comparator.naturalOrder()))
			.collect(Collectors.toList());
	collect.forEach(v ->{
		System.out.println(v.toString());
	});
}

输出:
User(name=司总, age=18)
User(name=张三, age=22)
User(name=李四, age=45)
案例3:自定义排序


@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22));
	list.add(new User("李四",45));
	list.add(new User("司总",18));

	List<User> collect = list.stream().sorted(Comparator.comparing(o -> o, new Comparator<User>() {
		@Override
		public int compare(User o1, User o2) {
			return o2.getAge() - o1.getAge();
		}
	})).collect(Collectors.toList());
	collect.forEach(v ->{
		System.out.println(v.toString());
	});
}

输出:

User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)
案例4:先按照年龄降序,年龄相同按照money升序排序

@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22,100));
	list.add(new User("李四",45,200));
	list.add(new User("司总",18,999));
	list.add(new User("秦总",18,888));

	
	List<User> collect = list.stream().sorted(Comparator.comparing(User::getAge).reversed()
	.thenComparing(User::getMoney)).collect(Collectors.toList());

	collect.forEach(v ->{
		System.out.println(v.toString());
	});
}

输出:
User(name=李四, age=45, money=200)
User(name=张三, age=22, money=100)
User(name=秦总, age=18, money=888)
User(name=司总, age=18, money=999)
案例5:先按照年龄降序,年龄相同按照money降序排序

@Test
void outLogger() throws Exception {
	List<User> list = new ArrayList<>();
	list.add(new User("张三",22,100));
	list.add(new User("李四",45,200));
	list.add(new User("司总",18,999));
	list.add(new User("秦总",18,888));


	List<User> collect = list.stream().sorted(Comparator.comparing(User::getAge)
	.thenComparing(User::getMoney).reversed()).collect(Collectors.toList());

	collect.forEach(v ->{
		System.out.println(v.toString());
	});
}

输出:
User(name=李四, age=45, money=200)
User(name=张三, age=22, money=100)
User(name=司总, age=18, money=999)
User(name=秦总, age=18, money=888)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值