List集合排序

又来带着问题学习啦

前言

我认为学一个新技术要带着问题去学 ,为什么用?怎么用?好不好用?

当然你都搜到这了,那肯定是晓得为什么用。废话不多说 开始今天的讲解

说到list排序 ,其实本质是 数组的【快排】 ,如果有兴趣的同鞋可以去温习一下数组排序,从冒泡排序开始 希尔排序 到最后的快速排序,难度是一点一点往上递增的,但是实际做出来 也并没有多难,写完以后 还可以更深刻的理解 list的排序,不然我们直接使用api也是会有点蒙蒙的。

Collections.sort()

1 最简单的情况,进行单一基础类之间的排序。但是他是有使用限制的,基本上只适用于 单一元素间进行排序。

List<Integer> list = new ArrayList<>();

list.add(43);
list.add(1223);
list.add(842);

Collections.sort(list);

执行完sort方法后 这个list就已经被排序完成了。

如果有兴趣的小伙伴也可以在前后打点,观测他排序所耗的时间,不妨多做一些数据。实际上是很快的。 

System.currentTimeMillis()

2 第二种情况 进行对象间的list排序

假设现在有 School类 。里面有属性 科目、分数、学生等。现在想根据 学生进行排序。

//这里是定义了实体类,他实现了Comparable 接口
//同时重写了 compareTo方法 根据分数进行了正序的排序
@Data
public class School implements Comparable<School> {

    private String subject;

	private String name;
 
	private int score;
 
	@Override
	public int compareTo(School sch) {
		return getScore() - sch.getScore();
	}
}

测试类

List<School> list = new ArrayList<>();

list.add("语文","小张",43);
list.add("语文","小刘",13);
list.add("数学","李四",81);
list.add("英语","王六",3);

Collections.sort(list);

至此 对于实体类List的正序排序 已经做好。

但实际还是有点麻烦,对代码的入侵性还是比较高的,如果想排序 还要去改实体类。

接下来介绍第三种,也是我项目中最长使用的一种

3 第三种情况 在测试类中直接进行排序

实体类

@Data
public class School  {

    private String subject;

	private String name;
 
	private int score;
 

}

测试类

List<School> list = new ArrayList<>();

list.add("语文","小张",43);
list.add("语文","小刘",13);
list.add("数学","李四",81);
list.add("英语","王六",3);

Collections.sort(School::getScore);

这样 就完成了 根据 分数 进行的正序排序

4 按照对象的 多属性 进行升序 或 降序的排序 (多属性自定义排序)

实体类不再进行描述

    //School 的 list 集合
    List<School> list = new ArrayList<>();
    list.add(new Student("英语","张三",90);
    list.add(new Student("数学","李四",80);
    list.add(new Student("英语","王五",91);
    list.add(new Student("语文","赵明",80);
    list.add(new Student("语文","钱海",75);
 
 
    //先按照分数从高到低排序,当分数相同时,然后按照学科(语文,数学,英语)排序
    List<String> addressOrder = Arrays.asList("语文","数学","英语");
    Collections.sort(list, new Comparator<School>()
    {
        public int compare(School s1, School s2)
        {
            if(s1.getScore().equals(s2.getScore())){
                int io1 = addressOrder.indexOf(s1.getSubject());
                int io2 = addressOrder.indexOf(s2.getSubject());
                return io1 - io2;
            }else{
                return s2.getScore() - s1.getScore();
            }
        }
    });

至此 自定义排序完成。

简单写了一些,如有错欢迎纠正。

睡觉啦 狗命要紧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值