Java8——Stream流操作List排序_List集合中每个对象元素按时间顺序排序

x33g5p2x  于2022-06-06 转载在 Java  
字(4.0k)|赞(0)|评价(0)|浏览(1058)

一个学生类的实体类

  1. @Data
  2. public class Student {
  3. private Long id;
  4. private String name;
  5. private int age;
  6. private Double height;
  7. public Student(Long id, String name, int age, Double height) {
  8. this.id = id;
  9. this.name = name;
  10. this.age = age;
  11. this.height = height;
  12. }

然后我们测试下三种排序方式:

  • 按照id升序排列
  • 按照id逆序排列
  • 按照age排序,然后按照height排序
  1. public class ListStreamSortTest {
  2. public static void main(String[] args) {
  3. // 一个集合中放入4个学生对象
  4. List<Student> list = new ArrayList<>();
  5. list.add(new Student(10002L, "ZhangSan", 19, 175.2));
  6. list.add(new Student(10003L, "LiSi", 18, 180.1));
  7. list.add(new Student(10004L, "Peter", 19, 170.8));
  8. list.add(new Student(10001L, "KangKang", 18, 167.4));
  9. // 打印默认顺序
  10. System.out.println("默认顺序:");
  11. list.stream().forEach(System.out::println);
  12. // 按照id排序
  13. System.out.println("id升序:");
  14. list.stream().sorted(Comparator.comparing(Student::getId))
  15. .forEach(System.out::println);
  16. // 按照id逆序排列
  17. System.out.println("id逆序:");
  18. list.stream().sorted(Comparator.comparing(Student::getId).reversed())
  19. .forEach(System.out::println);
  20. // 按照年龄排序,再按照升高排序
  21. System.out.println("age和height排序:");
  22. list.stream().sorted(Comparator.comparing(Student::getAge).thenComparing(Student::getHeight))
  23. .forEach(System.out::println);
  24. }
  25. }

执行结果:

  1. 默认顺序:
  2. Student{id=10002, name='ZhangSan', age=19, height=175.2}
  3. Student{id=10003, name='LiSi', age=18, height=180.1}
  4. Student{id=10004, name='Peter', age=19, height=170.8}
  5. Student{id=10001, name='KangKang', age=18, height=167.4}
  6. id升序:
  7. Student{id=10001, name='KangKang', age=18, height=167.4}
  8. Student{id=10002, name='ZhangSan', age=19, height=175.2}
  9. Student{id=10003, name='LiSi', age=18, height=180.1}
  10. Student{id=10004, name='Peter', age=19, height=170.8}
  11. id逆序:
  12. Student{id=10004, name='Peter', age=19, height=170.8}
  13. Student{id=10003, name='LiSi', age=18, height=180.1}
  14. Student{id=10002, name='ZhangSan', age=19, height=175.2}
  15. Student{id=10001, name='KangKang', age=18, height=167.4}
  16. ageheight排序:
  17. Student{id=10001, name='KangKang', age=18, height=167.4}
  18. Student{id=10003, name='LiSi', age=18, height=180.1}
  19. Student{id=10004, name='Peter', age=19, height=170.8}
  20. Student{id=10002, name='ZhangSan', age=19, height=175.2}

需求: 需要对List中的每个student对象按照birthday顺序排序,时间由小到大排列

1. 刚开始用的是冒泡排序,出现数据覆盖的情况

  1. for (int i = 0; i < list.size() - 1; i++) {
  2. for (int j = 0; j < list.size() - 1 - i; j++) {
  3. long time = list.get(j).getCreateAt().getTime();
  4. long time1 = list.get(j + 1).getCreateAt().getTime();
  5. if (time >time1) {
  6. Object temp = list.get(j+1);
  7. BeanUtils.copyProperties(list.get(j), list.get(j+1));
  8. BeanUtils.copyProperties(temp, list.get(j));
  9. }
  10. }

2. 之后想到了Comparator比较器

  1. public static <T> void sort(List<T> listComparator<? super T> )

这个里面就涉及到了Comparator 这个接口,位于java.util包下,排序是comparator能实现的功能之一,通俗地讲需要比较两个对象 谁排在前谁排在后,那么比较的方法就是:

  • public int compare(String o1, String o2):比较其两个参数的顺序
  1. 两个对象比较的结果有三种:大于,等于,小于。
  2. 如果要按照升序排序, o1 小于o2,返回(负数),相等返回001大于02返回(正数)
  3. 如果要按照降序排序 o1 小于o2,返回(正数),相等返回001大于02返回(负数)

操作如下

  1. package com.hbsi.test;
  2. import java.text.SimpleDateFormat;
  3. import java.util.*;
  4. /**
  5. * @author lbq
  6. * @date 2020 10 15:07
  7. */
  8. public class ListSort {
  9. static class Student {
  10. private String userName;
  11. private String birthday;
  12. }
  13. public static void main(String[] args) {
  14. Student s1 = new Student();
  15. Student s2 = new Student();
  16. Student s3 = new Student();
  17. List<Student> list = new ArrayList<Student>();
  18. s1.setUserName("aa");
  19. s1.setBirthday("1997-01-08");
  20. s2.setUserName("bb");
  21. s2.setBirthday("1990-11-08");
  22. s3.setUserName("cc");
  23. s3.setBirthday("1957-05-08");
  24. list.add(s1);
  25. list.add(s2);
  26. list.add(s3);
  27. System.out.println("排序前:");
  28. for (Student o : list) {
  29. System.out.println(o);
  30. }
  31. listSort(list);
  32. System.out.println("排序后:");
  33. for (Student o : list) {
  34. System.out.println(o);
  35. }
  36. }
  37. private static void listSort(List<Student> list) {
  38. Collections.sort(list, new Comparator<Student>() {
  39. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  40. public int compare(Student o1, Student o2) {
  41. try {
  42. Date dt1 = sf.parse(o1.getBirthday());
  43. Date dt2 = sf.parse(o2.getBirthday());
  44. if (dt1.getTime() > dt2.getTime()) {
  45. return 1;
  46. } else if (dt1.getTime() < dt2.getTime()) {
  47. return -1;
  48. } else {
  49. return 0;
  50. }
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. return 0;
  55. }
  56. });
  57. }
  58. }

相关文章

最新文章

更多