又来带着问题学习啦
前言
我认为学一个新技术要带着问题去学 ,为什么用?怎么用?好不好用?
当然你都搜到这了,那肯定是晓得为什么用。废话不多说 开始今天的讲解
说到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();
}
}
});
至此 自定义排序完成。
简单写了一些,如有错欢迎纠正。
睡觉啦 狗命要紧