一、数据准备
1. Student对象
@Data是lombok
importlombok.Data; publicclassStudent { /** 姓名 */privateStringname; /** 年龄 */privateIntegerage; /** 成绩 */privateDoublescore; /** 是否优秀学生 */privateBooleanmerit; }
2. 随机生成学生数据
2.1 生成年龄(16~19岁)
privatestaticintgetRandomAge() { Randomrandom=newRandom(); returnrandom.nextInt(3) +16; }
2.2 生成成绩(0~100分)两位小数
privatestaticdoublegetRandomScore() { Randomrandom=newRandom(); doublea=random.nextDouble() *100; DecimalFormatdf=newDecimalFormat("0.00"); Stringstr=df.format(a); returnDouble.parseDouble(str); }
2.3 生成优秀学生
privatestaticbooleangetRandomMerit() { Randomrandom=newRandom(); returnrandom.nextBoolean(); }
2.4 生成50名学生的数据
privatestaticList<Student>getStudentList() { List<Student>list=newArrayList<>(); Stringname="张"; for (inti=1; i<=5; i++) { Studentstudent=newStudent(); // 姓名拼接student.setName(name+i); student.setAge(getRandomAge()); // 设置缺考成绩if (i==2||i==3) { student.setScore(null); } else { student.setScore(getRandomScore()); } student.setMerit(getRandomMerit()); list.add(student); } returnlist; }
二、数据排序
1. 简单用法
假设没有缺考的学生,即学生都有成绩,都是随机生成的成绩
不走if(i == 2 || i == 3)的判断
1.1 排序年龄
List<Student>studentList=getStudentList(); // 进行年龄排序-正序studentList.sort(Comparator.comparingInt(Student::getAge)); // 排序-倒序studentList.sort(Comparator.comparingInt(Student::getAge).reversed());
1.2 排序成绩
List<Student>studentList=getStudentList(); // 进行成绩排序-正序studentList.sort(Comparator.comparingDouble(Student::getScore)); // 排序-倒序studentList.sort(Comparator.comparingDouble(Student::getScore).reversed());
1.3 以此类推
#排序优秀学生,使用了Boolean中的compare,而非比较器studentList.sort((o1, o2) ->Boolean.compare(o1.getMerit(), o2.getMerit())); #排序学生名称-倒序,使用了通用的比较Comparator.comparingstudentList.sort(Comparator.comparing(Student::getName).reversed());
2. 组合用法
2.1 按年龄正序排序,年龄相等的,按成绩倒序排
studentList.sort(Comparator.comparingInt(Student::getAge).thenComparing(Comparator.comparingDouble(Student::getScore).reversed())); #注意,下面这种跟上面是不同的结果,注意studentList.sort(Comparator.comparingInt(Student::getAge).thenComparingDouble(Student::getScore).reversed());
2.2 将没有成绩的排到最后或者最前
// 排到最后studentList.sort(Comparator.comparing(Student::getScore, Comparator.nullsLast(Double::compareTo))); // 排到最前studentList.sort(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo)));
2.3 将空对象排到最后或者最前
所谓空对象,即student对象为null
studentList.add(null);
// 排到最后studentList.sort(Comparator.nullsLast(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo)))); // 排到最前studentList.sort(Comparator.nullsFirst(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Double::compareTo))));
3. Comparator比较器分类
3.1 reversed()
翻转比较结果,正序变倒序
3.2 thenComparing开头的
进行二次比较使用,即多个比较条件的
3.3 nullsFirst和nullsLast
null值的对象或者null值的属性放在最前或者最后
注意区分null对象和null值属性的不同用法
3.4 comparing开头
正常使用的比较器