现在有一个类
public class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
一个列表
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
}
}
我们对该列表进行排序,则有如下两种最常用的方法
一、继承 Comparable 接口
我们让 Person 类实现 Comparable 接口,重写 compareTo 方法
public class Person implements Comparable<Person>{
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Person person) {
//这是从小到大排序,如果是person.getAge() - this.getAge() 则是从大到小排序
return this.getAge() - person.getAge();
}
}
调用 Collections.sort(list) 方法进行排序
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
Collections.sort(list);
list.forEach(person -> System.out.println(person));
}
}
运行结果
二、使用 Comparator比较器 排序
使用 Comparator比较器 无序修改原有的类,更加方便
我们查看 Collections 的 sort 方法
这边第二个参数就是我们要传入的比较器 Comparator
查看比较器源码
我们看到 比较器 是一个接口,且有 @FunctionalInterface 注解,表明是函数式接口,者我们可以直接使用 Lambda 表达式
Person 类无需再额外实现接口
public class Person{
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
直接使用 Comparator 比较器 如下
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
Collections.sort(list,(Person person1,Person person2) -> {
return person1.getAge() - person2.getAge();
});
list.forEach(person -> System.out.println(person));
}
}
接着我们看 idea 将比较器置灰,并提示 Can be replaced with 'Comparator.comparingInt'
因为 Comparator 已经有现成的 从小到大排序 方法,直接Replace
Collections.sort(list, Comparator.comparingInt(Person::getAge));
运行结果正确