基于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}]

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

(0)

相关推荐

  • java对象对比之comparable和comparator的区别

    一.元素的比较 1.1 基本类型的比较 java中的基本类型的对象是可以进行比较的 如 public static void main(String[] args){ int a = 10; int b = 20; System.out.println(a>b); System.out.println(a==b); System.out.println(a<b); char c1 = 'A'; char c2 = 'B'; System.out.println(c1>c2); Syste

  • Java实现储存对象并按对象某属性排序的几种方法示例

    本文实例讲述了Java实现储存对象并按对象某属性排序的几种方法.分享给大家供大家参考,具体如下: 在编程的时候,经常会出现对某一种类的对象们按照某属性进行自定义的排序,比如:学生对象按照age大小排序. 有一种方法就是把age单独提出来排好序,然后按照ages数组的顺序把students重存一次.但是这样太繁琐了,有没有更好的方法呢? 有滴~ 第一种,可以实现边添加边排序,需要用到TreeSet. 第二种,用数组存放对象们,但是不需单独取出某属性排列好再重存,而是在原数组上用比较器重新排一次序.

  • Java中实现Comparable和Comparator对象比较

    当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow pr

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

    一.背景介绍 在日常的java开发中,我们在返回一个对象集合时需要按照对象的某个属性或者某些属性进行排序返回给前端进行展示,例如我最近需要返回一个题库集合,需要先根据指定时间排序然后根据创建时间进行排序,在mysql层进行操作比较麻烦而且浪费时间,我们可以通过程序来进行排序. 二.案例代码 // 实体类 public class People { private Integer id; private String name; private Integer topTime;// 置顶时间 pr

  • 基于java中集合的概念(详解)

    1.集合是储存对象的,长度可变,可以封装不同的对象 2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类. 二每一个容器的数据结构不同,所以取出的动作细节也不一样.但是都有共性内容判断和取出,那么可以将共性提取,这些内部类都符合一个规则Iterator Iterator it = list.iterator(); while(it.hasNext()){ System.out

  • JAVA像SQL一样对List对象集合进行排序

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去. 在java 8 之前,实现对象Collection排序,集合中被排序和比较大小的对象得实现Comparable

  • 基于JS对象创建常用方式及原理分析

    前言 俗话说"在js语言中,一切都对象",而且创建对象的方式也有很多种,所以今天我们做一下梳理 最简单的方式 JavaScript创建对象最简单的方式是:对象字面量形式或使用Object构造函数 对象字面量形式 var person = new Object(); person.name = "jack"; person.sayName = function () { alert(this.name) } 使用Object构造函数 var person = { na

  • 基于js对象,操作属性、方法详解

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

  • 基于jQuery对象和DOM对象和字符串之间的转化实例

    1.字符串---------->jQuery对象 $(HTML字符串): $('<div>我是祖国的一朵小花</div>') 待添加列表 2.jQuery对象---------->DOM对象 下标选取法(原理:jQuery是DOM的数组形式):$("h2")[1] 使用.get(index)函数 3.字符串----------->DOM对象 写一个脚本函数 function parseDom(nodelist) { //nodelist是htm

  • jquery遍历json对象集合详解

    本文实例采用案例分析的方法介绍了jquery遍历json对象的三种情况,供大家参考,具体内容如下 第一个案例:jquery 遍历json对象集合 常用示例 jsp中 $.ajax({ url: "${applicationScope.rootpath}common/getContractPage.html?userConId=${userConId}", type: "post", dataType:"json", data: {}, succe

  • Java的Jackson库中复杂对象集合的几种简单转换

    话不多说,请看代码: package com; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxm

  • C#从实体对象集合中导出Excel的代码

    或是将Datagrid或是Gridview的输出导出,实现大体上又分为调用COM+组件或是利用Response(当然是B/S架构的项目)的输出来做,COM+组件的方式以前在项目中也应用过,但说实话感觉效果并不好,一是布署很麻烦,二是当时记得好像WEB服务器端的有个进程老关不掉,并且还有个问题是服务器端安装的EXCEL版本的不同,在程序中调用的方法传入的参数个数都不相同,真是够郁闷的,但是好处是这种方式当然是最灵活的. 我们还是以一个B/S架构的项目应用来说说导出吧,通用一点儿的还是从数据集往外导

  • C#特性-对象集合初始化器介绍

    C# 3.0为你提供了对象集合初始化器: /// <summary> /// 图书类 /// </summary> public class Book { /// <summary> /// 图书名称 /// </summary> public string Title { get; set; } /// <summary> /// 单价 /// </summary> public float Price { get; set; }

随机推荐