当前位置:   article > 正文

Java List集合 -- 最常用的两种排序方法_怎么在list集合中用比较器

怎么在list集合中用比较器

 现在有一个类

  1. public class Person {
  2. private int id;
  3. private int age;
  4. private String name;
  5. public Person(int id, int age, String name) {
  6. this.id = id;
  7. this.age = age;
  8. this.name = name;
  9. }
  10. public int getId() {
  11. return id;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Person{" +
  22. "id=" + id +
  23. ", age=" + age +
  24. ", name='" + name + '\'' +
  25. '}';
  26. }
  27. }

一个列表

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Person> list = new ArrayList<Person>() {{
  4. add(new Person(1, 30, "北京"));
  5. add(new Person(2, 20, "西安"));
  6. add(new Person(3, 40, "上海"));
  7. }};
  8. }
  9. }

我们对该列表进行排序,则有如下两种最常用的方法

一、继承 Comparable 接口

我们让 Person 类实现 Comparable 接口,重写 compareTo 方法

  1. public class Person implements Comparable<Person>{
  2. private int id;
  3. private int age;
  4. private String name;
  5. public Person(int id, int age, String name) {
  6. this.id = id;
  7. this.age = age;
  8. this.name = name;
  9. }
  10. public int getId() {
  11. return id;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Person{" +
  22. "id=" + id +
  23. ", age=" + age +
  24. ", name='" + name + '\'' +
  25. '}';
  26. }
  27. @Override
  28. public int compareTo(Person person) {
  29. //这是从小到大排序,如果是person.getAge() - this.getAge() 则是从大到小排序
  30. return this.getAge() - person.getAge();
  31. }
  32. }

调用 Collections.sort(list) 方法进行排序

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Person> list = new ArrayList<Person>() {{
  4. add(new Person(1, 30, "北京"));
  5. add(new Person(2, 20, "西安"));
  6. add(new Person(3, 40, "上海"));
  7. }};
  8. Collections.sort(list);
  9. list.forEach(person -> System.out.println(person));
  10. }
  11. }

运行结果

二、使用 Comparator比较器 排序

使用 Comparator比较器 无序修改原有的类,更加方便

我们查看 Collections 的 sort 方法

这边第二个参数就是我们要传入的比较器 Comparator

查看比较器源码 

我们看到 比较器 是一个接口,且有 @FunctionalInterface 注解,表明是函数式接口,者我们可以直接使用 Lambda 表达式

 Person 类无需再额外实现接口

  1. public class Person{
  2. private int id;
  3. private int age;
  4. private String name;
  5. public Person(int id, int age, String name) {
  6. this.id = id;
  7. this.age = age;
  8. this.name = name;
  9. }
  10. public int getId() {
  11. return id;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Person{" +
  22. "id=" + id +
  23. ", age=" + age +
  24. ", name='" + name + '\'' +
  25. '}';
  26. }
  27. }

直接使用 Comparator 比较器 如下

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Person> list = new ArrayList<Person>() {{
  4. add(new Person(1, 30, "北京"));
  5. add(new Person(2, 20, "西安"));
  6. add(new Person(3, 40, "上海"));
  7. }};
  8. Collections.sort(list,(Person person1,Person person2) -> {
  9. return person1.getAge() - person2.getAge();
  10. });
  11. list.forEach(person -> System.out.println(person));
  12. }
  13. }

 

 接着我们看 idea 将比较器置灰,并提示 Can be replaced with 'Comparator.comparingInt' 

 因为 Comparator 已经有现成的 从小到大排序 方法,直接Replace

Collections.sort(list, Comparator.comparingInt(Person::getAge));

运行结果正确 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号