`

Java中的Comparator 对多个排序条件的处理

    博客分类:
  • Java
 
阅读更多

 

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());
		}
	}
}
 

 

分享到:
评论

相关推荐

    java汉字排序

    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.pdf

    Java数据结构--13.Java8数据结构TreeSet 前⾔ ,上⼀篇中对 Set 接⼝最终实现类 HashSet 与 LinkedHashSet 做了介绍与分析,本篇将对另⼀种 Set 接⼝的最终实现类 TreeSet 进⾏ 介绍与分析。 先来看下 TreeSet 完整...

    java常用工具类的使用

    而在Java类库中有一个Arrays类的sort方法已经实现各种数据类型的排序算法。程序员只需要调用该类的方法即可。 代码演示:Arrays实现排序 public static void main(String[] args) { int[] ages={23, 45,12,76,34,...

    Java 集合方面的面试题

    如何使用 Java 8 中的新特性 Optional 类型来处理可能为 null 的集合元素? 如何使用 ConcurrentHashMap 类来实现高效的并发缓存? 如何使用 Spliterator 接口来实现自定义的集合遍历逻辑? 如何使用

    Comparators.js:Java8样式的Java可链接比较器

    Comparators.js Java8样式的Java可链接比较器Raison d'être 在使用JS时,我遇到了需要在Backbone集合中进行多键排序的情况-可以使用与期望的类型相同的比较器函数对自己进行排序。 当Java 8推出时,它带来了接口,...

    Java中的策略模式,完成一个简单地购物车,两种付款策略实例教程.docx

    用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略。 策略模式也被称作政策模式。实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数...

    AIC的Java课程1-6章

     知道实现比较器(Comparable,Comparator)用于排序算法(多态性)。  [*]了解同步包装和不可修改包装。 第12章 IO与串行化 2课时  了解Java IO 中类的层次结构,介绍Java IO采用的装饰...

    最大重叠区间个数–java实现

    (1)定义了新的Comparator接口,使之能正确针对左闭右开区间进行排序 (2)原文中的Point类对应于本文的Interval类,删除类原文中的Interval类 (3)增加了控制台的输入和输出 (4)原文中count初始值为1,本文中...

    习----题-Java-Web程序设计教程-[共2页].pdf

    (2)在测试类中生成多个学生类的对象,放入 TreeSet 中,要求按照 3 门课总成绩从高到低 排序,总成绩相等按学号排序。输出排序结果。 注意实现 Comparator 接口的 compare(Object obj1,Object obj2)函数。 4.以 ...

    MultipleComparatorSorting:使用多个比较器进行动态排序

    MultipalComparator排序

    Java服务器端开发面试.doc

    何时栈上创建,传递变量时候的按值传 递 Comparable 接口,Comparator类,用来做比较,主要是用于集合中,排序,插入等等 类初始化,变量初始化,静态变量,静态区,常量区等等 继承多态需要知道的有super, this, ...

    java8新特性学习1

    用法示例示例1:多个参数准备一个集合:假设我们要对集合排序,我们先看JDK7的写法,需要通过匿名内部类来构造一个 Comparator :如果是jdk8,我们可

    Java8特性lambda表达式和方法引用

    在jdk中有一个Arrays.sort()方法用来对数组进行排序,在没有用lambda表达式之前我们一般用匿名内部类来传递比较条件,但是出现lambda表达式之后,这个就可以替换掉了。 import java.util.Arrays; import java.util....

    hw6:面向 Java 程序员的现代 Web 应用程序开发作业 #6

    使用包streams.auction 中提供的类编写一个Java 程序,该程序将实现下面的拍卖竞标规则。 将 Streams API 与 Bid 对象集合一起使用。 使用 Comparator 并对流进行排序。 多人可以对一个产品出价。 只需使用硬编码...

    binary-insert-js:[已排序] javascript数组的二进制插入函数

    Java二进制插入 简单函数binaryInsert(array, value, comparator) ,可为javascript中的排序数组提供二... 如果要插入一个较大的排序列表中,但不一定要一次全部插入,那么与每次添加元素(甚至添加多个值然后进行排序

    Guava 16.0 API (CHM格式)

    排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。  5. Throwable类: 简化了异常检查和错误传播。  二. 集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知...

    java集合详解与总结

    排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 ...

Global site tag (gtag.js) - Google Analytics