可以看到使用比较器前,先要写一个实体类,还要实现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实现自定义的排序的更多相关文章

  1. ORACLE自定义顺序排序-转

    ORACLE可以借助DECODE函数,自定义顺序排序: select * from ( select 'Nick' as item from dual union all select 'Viki' ...

  2. [wordpress]根据自定义字段排序并根据自定义字段查询

    Wordpress中,根据根据自定义字段排序和查询是通过WP_Query()方法 如根据 一个自定义的sort的数字字段从小到大进行排序 $args = array( 'post_type' => ...

  3. java中的排序(自定义数据排序)--使用Collections的sort方法

    排序:将一组数据按相应的规则 排列 顺序 1.规则:       基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...

  4. js将对象数组按照自定义规则排序

    javascript对一个对象数组进行自定义规则排序,对象中有两个字段. 按照对象中一个字段a的值从小到大规则排序, 效果如下: 排序前: [0]:a=9,b=3 [1]:a=33,b=7 [2]:a ...

  5. OBjective-C:在可变数组NSMutableArray中添加相同对象后,进行自定义的排序方式输出

    以下为自定义的排序方式的实现 #import "Person+Compare.h" @implementation Person (Compare) -(NSComparisonR ...

  6. ORACLE自定义顺序排序

    ORACLE可以借助DECODE函数,自定义顺序排序: select * from ( select 'Nick' as item from dual union all select 'Viki' ...

  7. [c#基础]泛型集合的自定义类型排序

    引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...

  8. Collections自定义List排序规则

    Collections自定义List排序规则 //这里的顺序,是我自己定义的一个List<String> String[] regulation = {"jams",& ...

  9. NSArary自定义对象排序 NSComparator, compare

    reference from :http://mobile.51cto.com/hot-434804.htm 1.构建Person类 Person.h @interface Person : NSOb ...

随机推荐

  1. Oracle中数值的计算

    运算符 含义 · +(加)   加法 · ||(加) 字符串相加 · -(减)   减法 · *(乘)   乘法 · /(除)   除法 · mod(模)返回一个除法的整数余数  例如,12 % 5 ...

  2. JS高级 - 面向对象5(继承,引用)

    <script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...

  3. A. 【UNR #2】UOJ拯救计划

    题解: 感觉多了解一些npc问题是很有用的.. 就不会像我一样完全不考虑模数的性质 前面60分大概是送分 后面主要考虑一下%6带来的影响 平常都是那么大的模数,突然这么小??? 考虑正好使用k种颜色的 ...

  4. mac配置php7运行环境

    不用mac自带的apache和php,安装自己想要的版本.配置过程一直采坑,需要有闲时间和好的心理素质才行,哈哈,因为网上很教程都有纰漏之处,所以先把采坑无数后发现的个人认为最好的一个教程链接放在这里 ...

  5. Win10 下 hadoop3.0.0 单机部署

    前言 因近期要做 hadoop 有关的项目,需配置 hadoop 环境,简单起见就准备进行单机部署,方便开发调试.顺便记录下采坑步骤,方便碰到同样问题的朋友们. 安装步骤 一.下载 hadoop-XX ...

  6. 4712: 洪水 基于链分治的动态DP

    国际惯例的题面:看起来很神的样子......如果我说这是动态DP的板子题你敢信?基于链分治的动态DP?说人话,就是树链剖分线段树维护DP.既然是DP,那就先得有转移方程.我们令f[i]表示让i子树中的 ...

  7. AGC 016B.Colorful Hats(思路)

    题目链接 对于某个元素分类讨论一下,就可以知道n个元素的总颜色种数了. 比如对a[1]分类讨论: 若1的颜色和某个元素相同,则总颜色数为a[1].a[i]要么等于a[1](i与某个元素颜色相同,记个数 ...

  8. Codeforces.833B.The Bakery(线段树 DP)

    题目链接 \(Description\) 有n个数,将其分为k段,每段的值为这一段的总共数字种类,问最大总值是多少 \(Solution\) DP,用\(f[i][j]\)表示当前在i 分成了j份(第 ...

  9. BZOJ.3638.CF172 k-Maximum Subsequence Sum(模拟费用流 线段树)

    题目链接 各种zz错误..简直了 /* 19604kb 36292ms 题意:选$k$段不相交的区间,使其权值和最大. 朴素线段树:线段树上每个点维护O(k)个信息,区间合并时O(k^2),总O(mk ...

  10. 利用java编写的盲注脚本

    之前在网上见到一个盲注的题目,正好闲来无事,便用java写了个盲注脚本,并记录下过程中的坑 题目源码: <?php header("Content-Type: text/html;ch ...