java 实现Comparable接口排序,升序、降序、倒叙

简介: java 实现Comparable接口排序,升序、降序、倒叙

本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序。本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料。

1.实现的效果

2.创建排序的对象

package com.practice.test.comparable;
import java.util.Date;
/**
 * 描述:要比较的对象
 *
 * @author cui
 * @create 2018-12-18 14:07
 */
public class MySortBean implements Comparable<MySortBean> {
    private String name;
    private int age;
    private Date createTime;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
//    @Override
//    public int compareTo(MySortBean o) {
//        if (this.age>o.age){
//            return -1;
//        }else if (this.age==o.age){
//            return 0;
//        }
//        return 1;
//    }
        @Override
        public int compareTo(MySortBean o) {
            if (this.createTime.compareTo(o.getCreateTime())>0){
                return -1;
            }else if (this.createTime.compareTo(o.getCreateTime())==0){
                return 0;
            }
            return 1;
        }
    @Override
    public String toString() {
        return "MySortBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.编写test方法

package com.practice.test;
import com.practice.test.comparable.MySortBean;
import com.spring.testlist.util.DateUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * 描述:
 * 测试比较器
 *
 * @author cui
 * @create 2018-12-18 14:10
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class TestCompare {
    @Test
    public void testComparable(){
        MySortBean m1 = new MySortBean();
        m1.setAge(1);
        m1.setCreateTime(DateUtil.parseDate("2019-01-21 16:13:18"));
        MySortBean m2 = new MySortBean();
        m2.setAge(2);
        m2.setCreateTime(DateUtil.parseDate("2019-01-23 16:13:18"));
        MySortBean m3 = new MySortBean();
        m3.setAge(3);
        m3.setCreateTime(DateUtil.parseDate("2019-01-22 16:13:18"));
        MySortBean m4 = new MySortBean();
        m4.setAge(4);
        m4.setCreateTime(DateUtil.parseDate("2019-01-24 16:13:18"));
        MySortBean m5 = new MySortBean();
        m5.setAge(5);
        m5.setCreateTime(DateUtil.parseDate("2019-01-25 16:13:18"));
        List<MySortBean> l = new ArrayList<>(5);
        l.add(m1);
        l.add(m2);
        l.add(m4);
        l.add(m5);
        l.add(m3);
        System.out.println("排序前:");
        for (MySortBean i:l) {
            System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
        }
        /**
         * 自定义排序
         * 直接return -1 倒叙排列,list顺序颠倒输出
         *
         * if (o1.getAge()>o2.getAge()){
         *                     return 1;
         *                 }
         *                 return -1;
         *                 以上升序输出
         *
         * if (o1.getAge()>o2.getAge()){
         *                     return -1;
         *                 }
         *                 return 1;
         *                 以上降序输出
         *
         *
         */
/*        Comparator<MySortBean> comparator = new Comparator<MySortBean>() {
            @Override
            public int compare(MySortBean o1,MySortBean o2) {
                if (o1.getAge()>o2.getAge()){
                    return -1;
                }
                return 1;
            }
        };
        l.sort(comparator);*/
        l.sort(MySortBean::compareTo);
        System.out.println("--------");
        System.out.println("排序后:");
        for (MySortBean i:l) {
            System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
        }
    }
}

4.时间格式化工具类

package com.spring.testlist.util;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 *
 * @author cui
 * @create 2018-10-26 15:30
 **/
public class DateUtil extends org.apache.commons.lang3.time.DateUtils{
        private static String[] parsePatterns = {
                "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
                "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
                "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
        /**
         * 得到当前日期字符串 格式(yyyy-MM-dd)
         */
        public static String getDate() {
            return getDate("yyyy-MM-dd");
        }
    /**
     * 得到当前日期字符串 格式(yyyyMMdd)
     */
    public static String getSizeDate() {
        return getDate("yyyyMMdd");
    }
        /**
         * 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
         */
        public static String getDate(String pattern) {
            return DateFormatUtils.format(new Date(), pattern);
        }
        /**
         * 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
         */
        public static String formatDate(Date date, Object... pattern) {
            if (date == null) {
                return null;
            }
            String formatDate = null;
            if (pattern != null && pattern.length > 0) {
                formatDate = DateFormatUtils.format(date, pattern[0].toString());
            } else {
                formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
            }
            return formatDate;
        }
        /**
         * 得到日期时间字符串,转换格式(yyyy-MM-dd HH:mm:ss)
         */
        public static String formatDateTime(Date date) {
            return formatDate(date, "yyyy-MM-dd HH:mm:ss");
        }
        /**
         * 得到当前时间字符串 格式(HH:mm:ss)
         */
        public static String getTime() {
            return formatDate(new Date(), "HH:mm:ss");
        }
        /**
         * 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
         */
        public static String getDateTime() {
            return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
        }
        /**
         * 得到当前年份字符串 格式(yyyy)
         */
        public static String getYear() {
            return formatDate(new Date(), "yyyy");
        }
        /**
         * 得到当前月份字符串 格式(MM)
         */
        public static String getMonth() {
            return formatDate(new Date(), "MM");
        }
        /**
         * 得到当天字符串 格式(dd)
         */
        public static String getDay() {
            return formatDate(new Date(), "dd");
        }
        /**
         * 得到当前星期字符串 格式(E)星期几
         */
        public static String getWeek() {
            return formatDate(new Date(), "E");
        }
        /**
         * 日期型字符串转化为日期 格式
         * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
         * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
         * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
         */
        public static Date parseDate(Object str) {
            if (str == null) {
                return null;
            }
            try {
                return parseDate(str.toString(), parsePatterns);
            } catch (ParseException e) {
                return null;
            }
        }
        /**
         * 获取过去的天数
         *
         * @param date
         * @return
         */
        public static long pastDays(Date date) {
            long t = System.currentTimeMillis()- date.getTime();
            return t / (24 * 60 * 60 * 1000);
        }
        /**
         * 获取过去的小时
         *
         * @param date
         * @return
         */
        public static long pastHour(Date date) {
            long t =System.currentTimeMillis() - date.getTime();
            return t / (60 * 60 * 1000);
        }
        /**
         * 获取过去的分钟
         *
         * @param date
         * @return
         */
        public static long pastMinutes(Date date) {
            long t = System.currentTimeMillis() - date.getTime();
            return t / (60 * 1000);
        }
        /**
         * 转换为时间(天,时:分:秒.毫秒)
         *
         * @param timeMillis
         * @return
         */
        public static String formatDateTime(long timeMillis) {
            long day = timeMillis / (24 * 60 * 60 * 1000);
            long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
            long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
            long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
            long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
            return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
        }
        /**
         * 获取两个日期之间的天数
         *
         * @param before
         * @param after
         * @return
         */
        public static double getDistanceOfTwoDate(Date before, Date after) {
            long beforeTime = before.getTime();
            long afterTime = after.getTime();
            return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
        }
        public static String getFirstDayOfMonth() {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            //获取当前月第一天:
            Calendar c = Calendar.getInstance();
            c.add(Calendar.MONTH, 0);
            c.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
            String first = format.format(c.getTime());
            return first;
        }
        /**
         * @param args
         * @throws ParseException
         */
        public static void main(String[] args) throws ParseException {
//    System.out.println(formatDate(parseDate("2010/3/6")));
//    System.out.println(getDate("yyyy年MM月dd日 E"));
//    long time = new Date().getTime()-parseDate("2012-11-19").getTime();
//    System.out.println(time/(24*60*60*1000));
            String sizeDate = formatDate(new Date(),"yyyyMMdd");
            System.out.println(sizeDate);
        }
}

到此就结束了,具体的要实现什么排序,根据示例自己脑补扩展就好了,例子中备注也已经标注。

在使用排序注意两个坑

1.要排序的字段为空的异常处理

2.要排序的字段相等的异常处理

好了有问题欢迎留言

目录
相关文章
|
7天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
8天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
22 1
|
13天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
40 4
|
19天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
18天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
18天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
18 1
|
23天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
30 2
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
18天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9