class GroupComparator<T> implements Comparator<T> {
/**排序方式**/
public static final String DESC = "DESC";
public static final String ASC = "ASC";
/**数组下标0**/
public static final int SORT_NAME = 0;
/**数组下标1**/
public static final int SORT_TYPE = 1;
/**存储比较器**/
private List<Comparator<T>> comparators = new ArrayList<Comparator<T>>();
public GroupComparator(final String[] ... sortCriteria) {
for (final String[] criteria : sortCriteria) {
Comparator<T> sortComparator = new Comparator<T> () {
public int compare(T t1, T t2) {
int result = 0;
try {
String name = criteria[GroupComparator.SORT_NAME];
String type = criteria[GroupComparator.SORT_TYPE];
Field field = t1.getClass().getDeclaredField(name);
Type fieldType = field.getType();
String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = t1.getClass().getDeclaredMethod(methodName, null);
Object o1 = method.invoke(t1, null);
Object o2 = method.invoke(t2, null);
if (fieldType == Integer.TYPE || fieldType == Long.TYPE || fieldType == Double.TYPE || fieldType == Float.TYPE || fieldType == Short.TYPE || fieldType == Byte.TYPE) {
result = type.equals(GroupComparator.DESC) ? (Integer) o2 - (Integer) o1 : (Integer) o1 - (Integer) o2;
} else if (fieldType == String.class || fieldType == Character.class) {
String str1 = o1 == null ? "" : o1.toString();
String str2 = o2 == null ? "" : o2.toString();
result = type.equals(GroupComparator.DESC) ? str2.compareTo(str1) : str1.compareTo(str2);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
};
comparators.add(sortComparator);
}
}
public int compare(T t1, T t2) {
for (Comparator<T> comparator : comparators) {
int returnValue = comparator.compare(t1, t2);
if (returnValue != 0) return returnValue;
}
return 0;
}
}
class Employee {
public static final String SORT_CRITERIA_NAME = "name";
public static final String SORT_CRITERIA_LEVEL = "level";
public static final String SORT_CRITERIA_SALARY = "salary";
public static final String SORT_CRITERIA_YEAR = "year";
private String name;
private int id;
private int level;
private int salary;
private int year;
public Employee(int id, String name, int level, int salary, int year) {
this.id = id;
this.name = name;
this.level = level;
this.salary = salary;
this.year = year;
}
//省略get、set方法...
}
public class MultipleComparatorTest {
public static void main(String[] args) {
List<Employee> objs = new ArrayList<Employee>() {
{
add(new Employee(5, "aa", 3, 5000, 2));
add(new Employee(1, "ac", 9, 10000, 10));
add(new Employee(4, "bb", 5, 8000, 6));
add(new Employee(2, "rrrrr", 9, 12000, 7));
add(new Employee(6, "kkkk", 1, 2000, 1));
add(new Employee(3, "ccc", 5, 8000, 12));
}
};
String[][] sortCriteria = {
{ Employee.SORT_CRITERIA_NAME, GroupComparator.ASC},
{ Employee.SORT_CRITERIA_LEVEL, GroupComparator.DESC },
{ Employee.SORT_CRITERIA_SALARY, GroupComparator.ASC },
{ Employee.SORT_CRITERIA_YEAR, GroupComparator.DESC }
};
GroupComparator<Employee> gc = new GroupComparator<Employee>(sortCriteria);
Collections.sort(objs, gc);
for (Employee em : objs) {
System.out.println(em.getName() + "-" + em.getLevel() + "-" + em.getSalary() + "-" + em.getYear());
}
}
}
分享到:
相关推荐
1.import java.util.Comparator; 2.import net.sourceforge.pinyin4j.PinyinHelper; 3./** 4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class ...
Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...
而在Java类库中有一个Arrays类的sort方法已经实现各种数据类型的排序算法。程序员只需要调用该类的方法即可。 代码演示:Arrays实现排序 public static void main(String[] args) { int[] ages={23, 45,12,76,34,...
如何使用 Java 8 中的新特性 Optional 类型来处理可能为 null 的集合元素? 如何使用 ConcurrentHashMap 类来实现高效的并发缓存? 如何使用 Spliterator 接口来实现自定义的集合遍历逻辑? 如何使用
Comparators.js Java8样式的Java可链接比较器Raison d'être 在使用JS时,我遇到了需要在Backbone集合中进行多键排序的情况-可以使用与期望的类型相同的比较器函数对自己进行排序。 当Java 8推出时,它带来了接口,...
用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略。 策略模式也被称作政策模式。实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数...
知道实现比较器(Comparable,Comparator)用于排序算法(多态性)。 [*]了解同步包装和不可修改包装。 第12章 IO与串行化 2课时 了解Java IO 中类的层次结构,介绍Java IO采用的装饰...
(1)定义了新的Comparator接口,使之能正确针对左闭右开区间进行排序 (2)原文中的Point类对应于本文的Interval类,删除类原文中的Interval类 (3)增加了控制台的输入和输出 (4)原文中count初始值为1,本文中...
(2)在测试类中生成多个学生类的对象,放入 TreeSet 中,要求按照 3 门课总成绩从高到低 排序,总成绩相等按学号排序。输出排序结果。 注意实现 Comparator 接口的 compare(Object obj1,Object obj2)函数。 4.以 ...
MultipalComparator排序
何时栈上创建,传递变量时候的按值传 递 Comparable 接口,Comparator类,用来做比较,主要是用于集合中,排序,插入等等 类初始化,变量初始化,静态变量,静态区,常量区等等 继承多态需要知道的有super, this, ...
用法示例示例1:多个参数准备一个集合:假设我们要对集合排序,我们先看JDK7的写法,需要通过匿名内部类来构造一个 Comparator :如果是jdk8,我们可
在jdk中有一个Arrays.sort()方法用来对数组进行排序,在没有用lambda表达式之前我们一般用匿名内部类来传递比较条件,但是出现lambda表达式之后,这个就可以替换掉了。 import java.util.Arrays; import java.util....
使用包streams.auction 中提供的类编写一个Java 程序,该程序将实现下面的拍卖竞标规则。 将 Streams API 与 Bid 对象集合一起使用。 使用 Comparator 并对流进行排序。 多人可以对一个产品出价。 只需使用硬编码...
Java二进制插入 简单函数binaryInsert(array, value, comparator) ,可为javascript中的排序数组提供二... 如果要插入一个较大的排序列表中,但不一定要一次全部插入,那么与每次添加元素(甚至添加多个值然后进行排序
排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。 5. Throwable类: 简化了异常检查和错误传播。 二. 集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知...
排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 ...