说说Comparator比较器那些用法

简介: 关于java的排序,在java8之后有了函数式接口之后,就产生了很多种Comparator比较器的写法。细数一下那些常用的比较器。

一、数据准备

1. Student对象

@Data是lombok

importlombok.Data;
@DatapublicclassStudent {
/** 姓名 */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比较器分类

image.png

3.1 reversed()

翻转比较结果,正序变倒序

3.2 thenComparing开头的

进行二次比较使用,即多个比较条件的

3.3 nullsFirst和nullsLast

null值的对象或者null值的属性放在最前或者最后

注意区分null对象和null值属性的不同用法

3.4 comparing开头

正常使用的比较器

目录
相关文章
|
5月前
|
Java
Comparable和Comparator两种比较器详解
Comparable和Comparator两种比较器详解
20 0
|
9月前
Comparable与Comparator对象比较
Comparable与Comparator对象比较
30 0
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
74 0
|
Java
Java的比较器Comparable和Comparator用法
Java的比较器Comparable和Comparator用法
151 0
Comparable与Comparator有什么区别?
Comparable与Comparator有什么区别?
177 0
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
123 0
Java对象的比较和排序(Comparator和Comparable)
|
存储 Java 索引
【Java集合类】之TreeSet集合与Comparable/Comparator排序
【Java集合类】之TreeSet集合与Comparable/Comparator排序
111 0