基于Comparator对象集合实现多个条件按照优先级的比较

 更新时间:2021年07月12日 09:25:41   作者:CoderYin  
这篇文章主要介绍了基于Comparator对象集合实现多个条件按照优先级的比较,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、背景介绍

在日常的java开发中,我们在返回一个对象集合时需要按照对象的某个属性或者某些属性进行排序返回给前端进行展示,例如我最近需要返回一个题库集合,需要先根据指定时间排序然后根据创建时间进行排序,在mysql层进行操作比较麻烦而且浪费时间,我们可以通过程序来进行排序。

二、案例代码

// 实体类
public class People {
	private Integer id;
	private String name;
	private Integer topTime;// 置顶时间
	private Integer gmtCreate;// 创建时间 
	public People(Integer id, String name, Integer topTime, Integer gmtCreate) {
		super();
		this.id = id;
		this.name = name;
		this.topTime = topTime;
		this.gmtCreate = gmtCreate;
	}
 
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getTopTime() {
		return topTime;
	}
	public void setTopTime(Integer topTime) {
		this.topTime = topTime;
	}
	public Integer getGmtCreate() {
		return gmtCreate;
	}
	public void setGmtCreate(Integer gmtCreate) {
		this.gmtCreate = gmtCreate;
	}
 
	@Override
	public String toString() {
		return "People [id=" + id + ", name=" + name + ", topTime=" + topTime + ", gmtCreate=" + gmtCreate + "]";
	}
}
// 排序方法
public class PeopleComparator implements Comparator<People>{
 
	@Override
	public int compare(People o1, People o2) {
		int result = 0;
		// 按照置顶时间排序升序(o1,o2位置互换就是降序)
		int topTimeSeq = o2.getTopTime() - o1.getTopTime();
		if(topTimeSeq != 0){
			result = (topTimeSeq > 0) ? 3 : -1;
		}else{
			// 按照创建时间排序
			topTimeSeq = o2.getGmtCreate() - o1.getGmtCreate();
			if(topTimeSeq != 0){
				result = (topTimeSeq > 0) ? 2 : -2;
			}
		}
		return result;
	}
}
// 测试
public class PeopleTest {
	public static void main(String[] args) {
		List<People> peopleList = new ArrayList<People>(){
			{
				add(new People(1,"tom1",0,1));
				add(new People(2,"tom2",2,4));
				add(new People(3,"tom3",1,3));
				add(new People(4,"tom4",0,6));
				add(new People(5,"tom5",0,2));
				add(new People(6,"tom6",0,5));
			}
		};
		Collections.sort(peopleList,new PeopleComparator());
		for(People p:peopleList){
			System.out.println(p.toString());
		}
	}
}

测试结果

Comparator 多条件比较

class Card {
    int a;
    int b;
    public Card(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int getA() {
        return a;
    }
    public int getB() {
        return b;
    }
    @Override
    public String toString() {
        return "Card{" +
                "a=" + a +
                ", b=" + b +
                '}';
    }
}
public class Main {
    public static void main(String[] args) {
        List<Card> list = new ArrayList<>();
        list.add(new Card(0, 2));
        list.add(new Card(1, 1));
        list.add(new Card(1, 0));
        list.add(new Card(1, 0));
        list.add(new Card(2, 0));
        System.out.println(list);
        System.out.println();
        
        Collections.sort(list, new Comparator<Card>() {
            @Override
            public int compare(Card c1, Card c2) {
                // c1 - c2  升序
                // c2 - c1  降序
                int res1 = c2.b - c1.b;
                int res2 = c2.a - c1.a;
                // 当 b相等时比较a, 否则先比较b
                return res1 == 0 ? res2 : res1;
            }
        });
        System.out.println(list);
    }
}
[Card{a=0, b=2}, Card{a=1, b=1}, Card{a=1, b=0}, Card{a=1, b=0}, Card{a=2, b=0}]
[Card{a=0, b=2}, Card{a=1, b=1}, Card{a=2, b=0}, Card{a=1, b=0}, Card{a=1, b=0}]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何通过RabbitMq实现动态定时任务详解

    如何通过RabbitMq实现动态定时任务详解

    工作中经常会有定时任务的需求,常见的做法可以使用Timer、Quartz、Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,下面这篇文章主要给大家介绍了关于如何通过RabbitMq实现动态定时任务的相关资料,需要的朋友可以参考下
    2022-01-01
  • java 基础之JavaBean属性命名规范问题

    java 基础之JavaBean属性命名规范问题

    这篇文章主要介绍了java 基础之JavaBean属性命名规范问题的相关资料,需要的朋友可以参考下
    2017-05-05
  • springboot添加多数据源的方法实例教程

    springboot添加多数据源的方法实例教程

    这篇文章主要给大家介绍了关于springboot添加多数据源方法的相关资料,在实际开发中经常可能遇到在一个应用中可能要访问多个数据库多的情况,需要的朋友可以参考下
    2023-09-09
  • 解读Spring-Context的作用及用法

    解读Spring-Context的作用及用法

    这篇文章主要介绍了Spring-Context的作用及用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • java外卖订餐系统小项目

    java外卖订餐系统小项目

    这篇文章主要为大家详细介绍了java外卖订餐系统小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Mybatis中特殊SQL的执行的实现示例

    Mybatis中特殊SQL的执行的实现示例

    本文主要介绍了Mybatis中特殊SQL的执行的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 基于Java内存溢出的解决方法详解

    基于Java内存溢出的解决方法详解

    本篇文章是对Java内存溢出的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 图解Spring框架的设计理念与设计模式

    图解Spring框架的设计理念与设计模式

    这篇文章主要通过多图详细解释Spring框架的设计理念与设计模式,需要的朋友可以参考下
    2015-08-08
  • kotlin之协程的理解与使用详解

    kotlin之协程的理解与使用详解

    这篇文章主要介绍了kotlin之协程的理解与使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • spring使用@Async注解导致循环依赖问题异常的排查记录

    spring使用@Async注解导致循环依赖问题异常的排查记录

    这篇文章主要介绍了spring使用@Async注解导致循环依赖问题异常的排查记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论