赞
踩
现在有一个类
- 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, "上海"));
- }};
- }
-
- }
我们对该列表进行排序,则有如下两种最常用的方法
我们让 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比较器 无序修改原有的类,更加方便
我们查看 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));
运行结果正确
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。