使用Guava的ComparisonChain实现自定义的排序
可以看到使用比较器前,先要写一个实体类,还要实现comparable接口,实现compareTo方法。这个方法一般会返回-1 0 1三个int类型数字,分别表示,对象和传入的对象比较,排序应该在传入的对象之后。因为比较器通常是为了集合排序而实现的。
ComparisonChain 的好处就在于,可以用method().method().这样的链式比较,而不用if else这种可读性很差的面向过程的方式去判断大小。比较链的用法是当第一个compare没有比出大小时,转向第二个属性进行比较,如果第二个也没有比较出大小,转向第三个属性进行比较。。以此类推,一般来说前几个属性足够比较了,不会比到最后一个属性。
package comparable; import com.google.common.collect.ComparisonChain;
import lombok.Data; import java.util.*; /**
* @author xfyou
* @date 2018/9/30
*/
@Data
public class Course implements Comparable<Course> { /**
* 学号
*/
private String studentNumber; /**
* 姓名
*/
private String studentName; /**
* 分数
*/
private int score; @Override
public int compareTo(Course course) {
return ComparisonChain.start()
.compare(course.score, this.score)
.compare(this.studentNumber, course.studentNumber)
.result();
} public static void main(String[] args) {
TreeSet<Course> coursesSet = new TreeSet<>(); Course course3 = new Course();
course3.setScore(95);
course3.setStudentName("Smith");
course3.setStudentNumber("1003");
coursesSet.add(course3); Course course1 = new Course();
course1.setScore(90);
course1.setStudentName("Frank");
course1.setStudentNumber("1110");
coursesSet.add(course1); Course course2 = new Course();
course2.setScore(90);
course2.setStudentName("Tom");
course2.setStudentNumber("0002");
coursesSet.add(course2); // 编译时使用iterator实现
for (Course course : coursesSet) {
System.out.println(course);
}
} }
按照分数由大到小,分数相同的情况下按照学号由小到大来排序。运行结果如下:
Course(studentNumber=1003, studentName=Smith, score=95)
Course(studentNumber=0002, studentName=Tom, score=90)
Course(studentNumber=1110, studentName=Frank, score=90)
使用Guava的ComparisonChain实现自定义的排序的更多相关文章
- ORACLE自定义顺序排序-转
ORACLE可以借助DECODE函数,自定义顺序排序: select * from ( select 'Nick' as item from dual union all select 'Viki' ...
- [wordpress]根据自定义字段排序并根据自定义字段查询
Wordpress中,根据根据自定义字段排序和查询是通过WP_Query()方法 如根据 一个自定义的sort的数字字段从小到大进行排序 $args = array( 'post_type' => ...
- java中的排序(自定义数据排序)--使用Collections的sort方法
排序:将一组数据按相应的规则 排列 顺序 1.规则: 基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...
- js将对象数组按照自定义规则排序
javascript对一个对象数组进行自定义规则排序,对象中有两个字段. 按照对象中一个字段a的值从小到大规则排序, 效果如下: 排序前: [0]:a=9,b=3 [1]:a=33,b=7 [2]:a ...
- OBjective-C:在可变数组NSMutableArray中添加相同对象后,进行自定义的排序方式输出
以下为自定义的排序方式的实现 #import "Person+Compare.h" @implementation Person (Compare) -(NSComparisonR ...
- ORACLE自定义顺序排序
ORACLE可以借助DECODE函数,自定义顺序排序: select * from ( select 'Nick' as item from dual union all select 'Viki' ...
- [c#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- Collections自定义List排序规则
Collections自定义List排序规则 //这里的顺序,是我自己定义的一个List<String> String[] regulation = {"jams",& ...
- NSArary自定义对象排序 NSComparator, compare
reference from :http://mobile.51cto.com/hot-434804.htm 1.构建Person类 Person.h @interface Person : NSOb ...
随机推荐
- python 全栈开发,Day65(MySQL练习题,参考答案)
一.MySQL练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号.ps:针对的是自己的生物成绩比物理成绩高,再 ...
- python 全栈开发,Day64(视图,触发器,函数,存储过程,事务)
昨日内容回顾 pymysql:属于python的一个模块 pip3 install pymysql conn = pymysql.connect(...,charset = 'uft8') 创建游标 ...
- ERP发货系统的修改(四十三)
产品添加批号后相应修改产品库存表中对应批次产品的数量: /// <summary> /// 产品添加批号后相应修改产品库存表中对应批次产品的数量 /// </summary> ...
- .NetCore下使用Prometheus实现系统监控和警报 (六)进阶Grafana集成自定义收集指标
Prometheus中包含了很多收集指标,那么我们怎来在Grafana中来使用呢? 接下来我们还是以之前自定义的来演示如图:我们在Prometheus中已经可以看到这个之前我们自定义的类型了 关于Gr ...
- POJ 2010 Moo University - Financial Aid (优先队列)
题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...
- POJ 1742 Coins 【多重背包DP】
题意:有n种面额的硬币.面额.个数分别为A_i.C_i,求最多能搭配出几种不超过m的金额? 思路:dp[j]就是总数为j的价值是否已经有了这种方法,如果现在没有,那么我们就一个个硬币去尝试直到有,这种 ...
- 「2017 山东一轮集训 Day7」逆序对
题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai (ai<i) )= ...
- jenkins X实践系列(1) —— 背景知识
本文介绍jenkins X(以下简称jx)相关的背景技术. jenkins X 简介 Jenkins X 是一个高度集成化的CI/CD平台,基于Jenkins和Kubernetes实现,旨在解决微服务 ...
- 【Java】 剑指offer(57-1) 和为s的两个数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它 ...
- Storm中关于Topology的设计
一:介绍Storm设计模型 1.Topology Storm对任务的抽象,其实 就是将实时数据分析任务 分解为 不同的阶段 点: 计算组件 Spout Bolt 边: 数据流向 数据从上 ...