JAVA8 使用心得(五)--排序

Java集合排序详解
本文深入探讨了Java中集合数据的排序方法,包括使用stream().sorted()、Collections.sort()及集合自带.sort方法的具体实现,对比了不同排序方式的优劣,并提供了详细的代码示例。

在实际开发中,根据前端展示的各种需求,对集合数据的排序是十分有必要的。

知识储备

java的Collections.sort算法调用的是合并排序,它是稳定排序,当数据接近有序的时候,效率 更高,collections中的数据在排序前需要输入到array中,接着调用Arrays.sort函数来完成对象排序。
实现代码:

void mergerSort(int[] a){
	int len = a.lenght()
	int mid = len>>2
	if(len>1){
		int[] pre=a[0:mid);
		int[] after=a[mid:len);
		mergerSort(pre);
		mergerSort(after);
		merge(a,pre,after)
	}
}

示例代码:
基础类:

//用户类
public class User implements Comparable<User>{
    private int id;
    private String name;
    /** getters and setters**/
    
    @Override
    public int compareTo(@NotNull User user) {
        return this.id - user.getId ();//正序(此写法针对数值型数据)
    }
}

下面几种排序方式都是基于 Comparator或Comparable,可以类比着理解。

(一)stream().sorted()

public class MyTest {
    private List<User> users = new ArrayList<> ();
    @Before
    public void prepareInitData(){//准备初始测试数据
        for(int i=0;i<20;i++){
            User user = new User();
            user.setId (i);
            user.setName ("user"+i);
            users.add (user);
        }
    }
    @Test
    public void test(){
    	//1.User::getId方式 《等价于》 u1 -> u1.getId()
        List<User> newUsers = users.stream ()
                .sorted (Comparator.comparingInt (User::getId).reversed ())
                .collect (Collectors.toList ());
        //2.(o1,o2)方式
        newUsers = users.stream ()
                .sorted ((o1, o2) -> {
                    if(o1.getId ()>o2.getId ()){
                        return 1;//会将o1顺序下调
                    }else if(o1.getId ()<o2.getId ()){
                    	return -1;//会将o1顺序上调
                    }else {
                        return 0;//o1顺序不变
                    }
                })
                .collect (Collectors.toList ());
        //3.若User实现了Comparable接口并重写了compareTo方法,可以使用User::compareTo
        newUsers = users.stream ()
                .sorted (User::compareTo)
                .collect (Collectors.toList ());
                
        newUsers.stream ().forEach (userInfoDto -> 
        System.out.println (userInfoDto.getName ()));
    }
}

排序结果: 根据ID字段升序排列。

(二)Collections.sort ()

@Test
public void test(){
	//1.User::getId方式 《等价于》 u1 -> u1.getId()
    Collections.sort (users, (o1, o2) -> {
            if(o1.getId ()>o2.getId ()){
                return 1;//下移o1
            }else {
                return -1;//上移o1
            }
        });
    //2.若User实现了Comparable接口并重写了compareTo方法,可以使用User::compareTo
    //或是直接用users做入参,前提与User::compareTo的相同
    Collections.sort (users, User::compareTo);
	//等价于
	Collections.sort (users);
	
    users.stream ().forEach (userInfoDto -> 
    System.out.println (userInfoDto.getName ()));
}

(三)集合自带的.sort方法

@Test
public void test(){
	//1.根据compareTo进行排序
	//需要User实现Comparable接口并重写了compareTo方法
	users.sort (User::compareTo);
	//2.(o1,o2)方式
	users.sort ((o1, o2) -> {
            if(o1.getId ()>o2.getId ()){
                return 1;//下移o1
            }else {
                return -1;//上移o1
            }
        });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Funnee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值