对List集合中每个对象元素按时间顺序排序

x33g5p2x  于2022-05-31 转载在 其他  
字(4.3k)|赞(0)|评价(0)|浏览(490)

需求: 需要对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. t
  7. Object temp = list.get(j+1);
  8. BeanUtils.copyProperties(list.get(j), list.get(j+1));
  9. BeanUtils.copyProperties(temp, list.get(j));
  10. }
  11. }

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. public class ListSort {
  5. static class Student {
  6. private String userName;
  7. private String birthday;
  8. public Student() {
  9. }
  10. public String getUserName() {
  11. return userName;
  12. }
  13. public void setUserName(String userName) {
  14. this.userName = userName;
  15. }
  16. public String getBirthday() {
  17. return birthday;
  18. }
  19. public void setBirthday(String birthday) {
  20. this.birthday = birthday;
  21. }
  22. @Override
  23. public String toString() {
  24. return "Student{" +
  25. "userName='" + userName + '\'' +
  26. ", birthday='" + birthday + '\'' +
  27. '}';
  28. }
  29. }
  30. public static void main(String[] args) {
  31. Student s1 = new Student();
  32. Student s2 = new Student();
  33. Student s3 = new Student();
  34. List<Student> list = new ArrayList<Student>();
  35. s1.setUserName("aa");
  36. s1.setBirthday("1997-01-08");
  37. s2.setUserName("bb");
  38. s2.setBirthday("1990-11-08");
  39. s3.setUserName("cc");
  40. s3.setBirthday("1957-05-08");
  41. list.add(s1);
  42. list.add(s2);
  43. list.add(s3);
  44. System.out.println("排序前:");
  45. for (Student o : list) {
  46. System.out.println(o);
  47. }
  48. listSort(list);
  49. System.out.println("排序后:");
  50. for (Student o : list) {
  51. System.out.println(o);
  52. }
  53. }
  54. private static void listSort(List<Student> list) {
  55. Collections.sort(list, new Comparator<Student>() {
  56. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  57. public int compare(Student o1, Student o2) {
  58. try {
  59. Date dt1 = sf.parse(o1.getBirthday());
  60. Date dt2 = sf.parse(o2.getBirthday());
  61. if (dt1.getTime() > dt2.getTime()) {
  62. return 1;
  63. } else if (dt1.getTime() < dt2.getTime()) {
  64. return -1;
  65. } else {
  66. return 0;
  67. }
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. return 0;
  72. }
  73. });
  74. }
  75. }

List集合, 时间正序排列、倒序排序

  1. public class Test {
  2. public static void main(String[] args) {
  3. //MySQL识别的日期格式
  4. String str01 = "2021-06-26T12:11:52.000+0000";
  5. String str02 = "2021-06-25T12:08:41.000+0000";
  6. String str03 = "2021-06-27T12:18:22.000+0000";
  7. Student student01 = new Student(1, "张三", dealDateFormat(str01));
  8. Student student02 = new Student(2, "李四", dealDateFormat(str02));
  9. Student student03 = new Student(3, "王五", dealDateFormat(str03));
  10. List<Student> arrayList = new ArrayList<>();
  11. Collections.addAll(arrayList, student01, student02, student03);
  12. //TODO:正序排列[最小的时间在前]
  13. // 输出: [{"date":"2021-06-25 12:08:41","name":"李四","id":2},
  14. // {"date":"2021-06-26 12:11:52","name":"张三","id":1},
  15. // {"date":"2021-06-27 12:18:22","name":"王五","id":3}]
  16. Collections.sort(arrayList, Comparator.comparing(Student::getDate));
  17. System.out.println(JSON.toJSON(arrayList));
  18. //TODO:倒序排序[最大的在前]
  19. //输出: [{"date":"2021-06-27 12:18:22","name":"王五","id":3},
  20. // {"date":"2021-06-26 12:11:52","name":"张三","id":1},
  21. // {"date":"2021-06-25 12:08:41","name":"李四","id":2}]
  22. Collections.sort(arrayList, new CalendarComparator());
  23. System.out.println(JSON.toJSON(arrayList));
  24. }
  25. // 时间倒序排序
  26. private static class CalendarComparator implements Comparator {
  27. public int compare(Object object1, Object object2) {
  28. //实现接口中的方法
  29. Student p1 = (Student) object1; // 强制转换
  30. Student p2 = (Student) object2;
  31. return p2.getDate().compareTo(p1.getDate());
  32. }
  33. }
  34. }
  1. static String dealDateFormat(String oldDate) {
  2. Date date1 = null;
  3. DateFormat df2 = null;
  4. try {
  5. DateFormat df = new SimpleDateFormat(ExchangeConstants.FORMAT_T);
  6. Date date = df.parse(oldDate);
  7. SimpleDateFormat df1 = new SimpleDateFormat(ExchangeConstants.FORMAT_Z, Locale.UK);
  8. date1 = df1.parse(date.toString());
  9. df2 = new SimpleDateFormat(ExchangeConstants.FORMAT);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. return df2.format(date1);
  14. }

相关文章