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

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

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

for (int i = 0; i < list.size() - 1; i++) {for (int j = 0; j < list.size() - 1 - i; j++) {long time = list.get(j).getCreateAt().getTime();long time1 = list.get(j + 1).getCreateAt().getTime();if (time >time1) {tObject temp = list.get(j+1);BeanUtils.copyProperties(list.get(j), list.get(j+1));BeanUtils.copyProperties(temp, list.get(j));}}

2. 之后想到了Comparator比较器

public static <T> void sort(List<T> list,Comparator<? super T> )

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

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

操作如下

package com.hbsi.test;import java.text.SimpleDateFormat;
import java.util.*;public class ListSort {static class Student {private String userName;private String birthday;public Student() {}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Student{" +"userName='" + userName + '\'' +", birthday='" + birthday + '\'' +'}';}}public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();Student s3 = new Student();List<Student> list = new ArrayList<Student>();s1.setUserName("aa");s1.setBirthday("1997-01-08");s2.setUserName("bb");s2.setBirthday("1990-11-08");s3.setUserName("cc");s3.setBirthday("1957-05-08");list.add(s1);list.add(s2);list.add(s3);System.out.println("排序前:");for (Student o : list) {System.out.println(o);}listSort(list);System.out.println("排序后:");for (Student o : list) {System.out.println(o);}}private static void listSort(List<Student> list) {Collections.sort(list, new Comparator<Student>() {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");public int compare(Student o1, Student o2) {try {Date dt1 = sf.parse(o1.getBirthday());Date dt2 = sf.parse(o2.getBirthday());if (dt1.getTime() > dt2.getTime()) {return 1;} else if (dt1.getTime() < dt2.getTime()) {return -1;} else {return 0;}} catch (Exception e) {e.printStackTrace();}return 0;}});}
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot读取resource或template中的文件

Spring-Boot读取resource或template中的文件 1.项目场景&#xff1a; 以jar包方式部署系统&#xff0c;想读取resource或是template下面的文件时&#xff0c;报 File Not Found 我遇到的情况是&#xff0c;整个项目达成了一个包&#xff0c;在开发环境&#xff08;windows i…

java slot_LocalVariableTable之 Slot 复用

LocalVariableTable中的 Slot&#xff0c; 是存在复用现象的&#xff0c;这个我早就知道&#xff0c;但是&#xff0c;不太清楚是如何复用的。Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量slot做太多限制&#xff0c;只是规定了参数要从下标为0开始的局部…

关于使用this.getClass().getResource(“/“)获取文件时遇到的坑_ClassPathResource加载资源文件用法

最近在工作中遇到需要读取配置文件&#xff0c;然后第一想法就是将文件放到项目的resources目录下, 然后使用&#xff1a; String fileName "config/zh.md" String path this.getClass().getResource("/").getPath() fileName; System.out.println(p…

Objects.requireNonNull( )方法说明

Objects.requireNonNull( )方法在java.util.Objects中 作用就是判断一个对象是否为空 底层源码&#xff1a; /* param obj 需要检测是否为空的对象* param <T> 对象类型* return 对象不为空则返回该对象* throws 对象为空则报NullPointerException异常*/public static …

java 类的执行顺序_Java-类加载和main()方法的执行顺序?

2、类加载和main()的执行顺序&#xff1f;备注&#xff1a;执行main()方法会先加载main()方法所在的类。存在继承关系中&#xff0c;创建子类对象初始化过程为:父类静态成员和语句块子类静态成员和静态语句块父类普通成员和普通语句块父类构造函数子类普通成员和普通语句块父类…

利用Gson解析多层嵌套的JSON数据

数据实例: {"error": 0,"status": "success","results": [{"currentCity": "青岛","index"

编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...

【多选题】下列关于多行注释的应用,正确的是( )【单选题】是在思维中把对象分解为各个部分、侧面、属性以及阶段,分别加以考察的方法。(1.0分)【判断题】多行注释“/*...*/”中不可以嵌套单行注释“//”。( )【多选题】直觉具有( )等特性。(2.0分)【多选题】马克思主义科学技术…

数据模型 同比 环比_同比和环比计算公式?

一、同比增长计算公式&#xff1a; 1、同比增长率(本期数&#xff0d;同期数)同期数100% 例子&#xff1a;比如说去年3月的产32313133353236313431303231363533e4b893e5b19e31333365666237值100万&#xff0c;本年3月的产值300万&#xff0c;同比增长率是多少&#xff1f; 本…

mysql80配置环境变量_MySQL:安装与配置

一、MySQL安装0、下载社区版安装包1、进入安装页面&#xff0c;这里不选择默认安装的所有工具&#xff0c;仅选择Server only。2、如果没有VC环境就点击execute安装&#xff0c;已安装就继续下一步。3、安装MySQL服务&#xff0c;Next。4、进入MySQL的配置环节&#xff0c;首先…

解决SVN无法add to ignore list的问题

有时候&#xff0c;在SVN中添加某文件夹到忽略列表即add to ignore list的时候报错&#xff0c;无法添加进忽略列表&#xff0c;这里总结一下&#xff0c;无非就是两个原因 仓库中已经存在了该文件夹的历史版本&#xff0c;因而无法忽略 解决方法&#xff1a;先备份该文件夹&am…

oracle正则表达式包含但不含_Oracle 正则表达式(详细)

Oracle 正则表达式正则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板&#xff0c;将某个字符模式与所搜索的字符串进行匹配。本文详细地列出了能在正则表达式中使用…

获取某个月中的第一天和最后一天某个月的天数当月第一天,当月最后一天,当年的第一天,当年的最后一天

获取某个月中的第一天和最后一天&某个月的天数 public static void main(String args[]){int month 2;// 2月Calendar cal Calendar.getInstance();cal.set(Calendar.YEAR, 2022);cal.set(Calendar.MONTH, month - 1);int max cal.getActualMaximum(Calendar.DATE);int…

python使用loaddata_Python中LOADDATAINFILE语句导入数据(txt)进入MySQL的一些注意事项...

问题&#xff1a;ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ROW 1 at line 1")代码如下&#xff1a;# -*- coding: utf-8 -*-"&quo…

SimpleDateFormat 日期格式化,以及sdf.parse(“2022-02-30“)顺序加问题

时间日期标识符&#xff1a; yyyy&#xff1a;年 MM&#xff1a;月 dd&#xff1a;日 hh&#xff1a;1~12小时制(1-12) HH&#xff1a;24小时制(0-23) mm&#xff1a;分 ss&#xff1a;秒 S&#xff1a;毫秒 E&#xff1a;星期几 D&#xff1a;一年中的第几…

SimpleDateFormat的线程不安全问题

一、前言 日期的转换与格式化在项目中应该是比较常用的了 一个问题&#xff1a;项目中的日期转换怎么用的&#xff1f;SimpleDateFormat 用过吗&#xff1f;能说一下 SimpleDateFormat 线程安全问题吗&#xff0c;以及如何解决&#xff1f; 回答&#xff1a;平时就是在全局定…

JVM——System.gc、内存溢出、内存泄漏、STW、安全点、安全区域、强软弱虚引用

文章目录①. System.gc()的理解②. 内存溢出(out of Memory)③. 内存泄漏(Memory Leak)④. Stop The World⑤. 多线程中的并行与并发⑥. 垃圾回收的并行、串行、并发⑦. 安全点(Safepoint)⑧. 安全区域(Safe Region)⑨. 引用①. 强引用:不回收②. 软引用: 内存不足即回收③. 弱…

大专生自学java找不到工作_自学Java真的找不到好工作吗?

自学Java真的找不到好工作吗&#xff1f;只能说有点难&#xff01;虽然职友集数据显示Java开发相关的岗位日招聘量为89754条&#xff0c;全国Java开发工程师的平均薪资为13210元/月。从以上可以看出目前Java行业还远没有饱和&#xff0c;Java开发人才在就业市场也是很吃香&…

Java——ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

文章目录①. ThreadLocal简介①. ThreadLocal是什么②. api介绍③. 永远的helloword④. 通过上面代码总结②. 从阿里ThreadLocal规范开始①. 非线程安全的SimpleDateFormat②. 将SimpleDateFormat定义成局部变量(方案一)③. ThreadLocal 解决日期格式乱码问题④. 阿里规范怎么说…

java后端概述_Java后端测试概述

[本文出自天外归云的博客园]多种单测技术1. 要学会Spring MVC/Boot测试中自带的mock方法。2. 学会junit中的方法&#xff0c;对于注解的使用等。3. 学会使用结合第三方Mockito来做mock测试。一些技巧和概念1. 对于复杂方法中&#xff0c;要学会如何拆解逻辑&#xff0c;划分单元…

Java私有方法运用场景_java6-3 封装和private关键字

1、 private:是一个权限修饰符可以修饰成员变量和成员方法被其修饰的成员只能在本类中被访问定义一个学生类&#xff1a;成员变量&#xff1a;name&#xff0c;age成员方法&#xff1a;show()方法2、我们在使用这个案例的过程中&#xff0c;发现了一个问题&#xff1a;通过对象…