JDK里的Comparator方法为用户提供了自定义排序规则的接口,而我们在实际使用是一般也只是用了一个排序维度,本文介绍下多级或多个维度的排序需求下的接口实现。
我们假设一个雇员对象,包含级别、工资和入职年份(为了简单,这些属性写成 public),代码如下:
public Class Employee { public int level; //级别 public int salary; //工资 public int years; //入职年数 }
现在我需要做一个这样的雇员列表,首先级别最高的排在前面,如果级别相等,那么按工资排序,工资高的排在前面,如果工资相当则按入职年数排序,入职时间最长的排在前面。
因为雇员列表是在内存中的一个 List<Employee> 对象,现在要对这个 List 中的雇员按上面的要求进行排序 Collections.sort(employeeList, comparator),那么这个 Comparator 应该怎么写呢?
下面这种肯定是不对的
Comparator<Employee> cp_by_default = new Comparator<Employee>(){ @Override public int compare(Employee a1, Employee a2) { int a = a2.level - a1.level; if(a > 0) return a; a = a2.salary - a1.salary; if(a > 0) return a; return a2.years - a1.years; } };
正确参考代码写法如下
package net.oschina.tester; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * 多个排序条件测试 */ public class Employee { public static void main(String[] args) { List<Employee> objs = new ArrayList<Employee>(){{ add(new Employee(5,3,5000,2)); add(new Employee(1,9,10000,10)); add(new Employee(4,5,8000,6)); add(new Employee(2,9,12000,7)); add(new Employee(6,1,2000,1)); add(new Employee(3,5,8000,12)); }}; Collections.sort(objs, comparator); System.out.println("No\tLevel\tSalary\tYears\n============================="); for(Employee a : objs) System.out.printf("%d\t%d\t%d\t%d\n",a.id,a.level,a.salary,a.year); } public Employee(int id, int level, int salary, int year){ this.id = id; this.level = level; this.salary = salary; this.year = year; } public int id; public int level; public int salary; public int year; private final static Comparator<Employee> comparator = new Comparator<Employee>(){ @Override public int compare(Employee a1, Employee a2) { int cr = 0; int a = a2.level - a1.level; if(a != 0) cr = (a>0)?3:-1; else{ a = a2.salary - a1.salary; if(a != 0) cr = (a>0)?2:-2; else{ a = (int)(a2.year - a1.year); if(a != 0) cr = (a>0)?1:-3; } } return cr; } }; }
上面参考方法给出了3级排序规则下的接口实现方法,2级或3级以上的接口实现方式类似。
相关推荐
主要介绍了JAVA使用Comparator接口实现自定义排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
程序实现时间排序Comparator
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
Java中Comparator接口的用法 对集合排序的例子 Comparator
java排序Comparator和Comparable
NULL 博文链接:https://elvin-chu.iteye.com/blog/1979500
List对象集合的排序:比较器Comparator
像这样的日志代码会更好: if (log.isLoggable(Level.FINE)) { log.log(Level.FINE, "I am here, and the value of X is {} and Y is {}", new Object[]{calcX(), calcY()}); } 应用的性能取决于它的代码如何...
可以通过两种方式自定义对象的属性大小进行比较,对一个list或数组对根据属性排序一个list或数组
NULL 博文链接:https://singhoo.iteye.com/blog/1704428
在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是Baeldung上的“Java ——...
java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子
493.491.JAVA基础教程_常用类-使用Comparator实现定制排序(493).rar
计算机后端-Java-Java核心基础-第22章 常用类 23. 使用Comparator实现定制排序.avi
主要介绍了Java8 Comparator排序方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class PinyinComparator implements Comparator<Object> { 9. public int compare(Object o1, Object o2) { 10...
Comparable&Comparator区别,看完就明白了
comparator接口与Comparable接口的区别
文件比對工具,可以生成比對報告,支持itd、doc和ttx。
主要给大家介绍了关于Java 8 Comparator: 列表排序的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧