java 自定义比较器用法

什么是比较器

  1. 比较器实质就是重载比较运算符
  2. 比较器可以很好的应用在特殊标准的排序上
  3. 比较器可以很好的应对在根据特殊标准排序的结构上
  4. 代码变得异常容易,还用于范型编程

自己定义比较器是自己设置的比较类实现了 Comparator 接口,代码如下

public static class MySort implements Comparator<Student> {
  // 根据id降序排列, 如果id相同按照年龄升序排列
  @Override
  public int compare(Student o1, Student o2) {
    return 0;
  }
}

对于任何比较器都有以下规则

  1. compare 方法里,遵循一个统一的规范
  2. 返回负数的时候,认为第一个参数应该排在前面
  3. 返回正数的时候,认为第二个参数应该排在前面
  4. 返回 0 的时候,认为无所谓谁放在前面

例如:有个学生类,并且有nameidage 三个属性

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 升序排列

  1. 自定义排序规则
public class AgeAsc implements Comparator<Student> {
	@Override
  public int compare(Student o1, Student o2) {
    return o1.age - o2.age;
  }
}
  1. 进行测试
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 降序排列

  1. 自定义排序规则
public class IdDesc implements Comparator<Student> {
	@Override
	 public int compare(Student o1, Student o2) {
	   return o2.id - o1.id;
	 }
}
  1. 进行测试,测试代码同上
/*
测试结果
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 相同则按章年龄升序

  1. 设置排序规则
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);
	}
}
  1. 代码测试
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
*/

一般在项目开发情况下,排序就直接在数据库查询时进行排序,利用数据库排序尽量要走索引,这样排序将会更快一些,另外,还可以对查询的结果集进行 Streamsort 进行排序也会很方便。

以上就是一些排序的内容,经常练习,孰能生巧。