java 自定义比较器用法
什么是比较器
- 比较器实质就是重载比较运算符
- 比较器可以很好的应用在特殊标准的排序上
- 比较器可以很好的应对在根据特殊标准排序的结构上
- 代码变得异常容易,还用于范型编程
自己定义比较器是自己设置的比较类实现了 Comparator 接口,代码如下
public static class MySort implements Comparator<Student> {
// 根据id降序排列, 如果id相同按照年龄升序排列
@Override
public int compare(Student o1, Student o2) {
return 0;
}
}
对于任何比较器都有以下规则
compare方法里,遵循一个统一的规范- 返回负数的时候,认为第一个参数应该排在前面
- 返回正数的时候,认为第二个参数应该排在前面
- 返回 0 的时候,认为无所谓谁放在前面
例如:有个学生类,并且有name, id, age 三个属性
public class Student {
String name;
int id;
int age;
public Student(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
public String toString(){
return "name = " + name + ", id = " + id + ", age = " + age;
}
}
使用自定义排序
1. 根据 age 升序排列
- 自定义排序规则
public class AgeAsc implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
}
- 进行测试
public static void test() {
Student s1 = new Student("A", 1, 11);
Student s2 = new Student("A", 2, 14);
Student s3 = new Student("A", 3, 1);
Student s4 = new Student("A", 4, 51);
Student s5 = new Student("A", 5, 31);
Student stuArr = {s1, s2, s3, s4, s5};
Arrays.sort(stuArr, new AgeAsc());
for (Student student : stuArr ) {
System.out.println(student);
}
}
/*
测试结果
name = A, id = 3, age = 1
name = A, id = 1, age = 11
name = A, id = 2, age = 14
name = A, id = 5, age = 31
name = A, id = 4, age = 51
*/
2. 根据 id 降序排列
- 自定义排序规则
public class IdDesc implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o2.id - o1.id;
}
}
- 进行测试,测试代码同上
/*
测试结果
name = A, id = 5, age = 31
name = A, id = 4, age = 51
name = A, id = 3, age = 1
name = A, id = 2, age = 14
name = A, id = 1, age = 11
*/
根据 id 降序,id 相同则按章年龄升序
- 设置排序规则
public class MySort implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o2.id != o1.id? (o2.id - o1.id) : (o1.age - o2.age);
}
}
- 代码测试
public void test() {
Student s1 = new Student("A", 1, 11);
Student s2 = new Student("A", 2, 14);
Student s3 = new Student("A", 3, 1);
Student s4 = new Student("A", 4, 51);
Student s5 = new Student("A", 4, 31);
Student stuArr = {s1, s2, s3, s4, s5};
Arrays.sort(stuArr, new AgeAsc());
for (Student student : stuArr ) {
System.out.println(student);
}
}
/*
测试结果
name = A, id = 4, age = 31
name = A, id = 4, age = 51
name = A, id = 2, age = 1
name = A, id = 2, age = 14
name = A, id = 1, age = 11
*/
一般在项目开发情况下,排序就直接在数据库查询时进行排序,利用数据库排序尽量要走索引,这样排序将会更快一些,另外,还可以对查询的结果集进行 Stream 的 sort 进行排序也会很方便。
以上就是一些排序的内容,经常练习,孰能生巧。