`

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排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

    Java对List多个排序、查询条件的处理

    在Java编程中,对List进行多个排序和查询条件的处理是一项常见的任务,特别是在处理数据集合时。本篇文章将深入探讨如何使用Java实现这些操作,并基于给出的`GroupFilterSortUtils.java`文件,我们可以推断这是一个...

    详解JAVA使用Comparator接口实现自定义排序

    在实际开发中,使用Comparator接口可以解决许多排序问题,例如按照复杂的业务规则排序、按照多个字段排序等等。 Comparator接口提供了很高的灵活性和可扩展性,满足了我们对对象排序的需求。 JAVA使用Comparator...

    java Comparator 用法 例子

    此外,Comparator还可以通过`thenComparing()`方法进行链式比较,这样可以实现多个条件的排序。例如,如果年龄相同,我们可以按照姓名排序: ```java userList.sort(Comparator.comparing(User::getAge) ....

    java List中对象多属性排序及各属性排序设置

    本文将深入探讨如何在Java的List中对包含多个属性的对象进行排序,并且支持动态设置每个属性的排序方式。这个功能的实现是通过泛型和自定义比较器(Comparator)来完成的,对于复杂的数据排序需求具有很高的灵活性。...

    JAVA 对象数组按照多个属性进行排序

    在Java编程中,对象数组排序是一项常见的任务,...以上就是关于“JAVA 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。

    java的Comparator和Comparable.docx

    当我们需要对一个集合或数组中的非数值类型对象进行排序,或者需要根据对象的多个属性进行复杂排序时,Comparator 就派上了用场。 Comparator 接口有一个核心方法 `compare(T o1, T o2)`,这个方法返回一个整数值,...

    java 中文姓氏 排序

    如果我们需要对一个对象列表中的某个字段(如年龄)进行排序,可以创建一个 `Comparator` 实现。 ```java import java.util.*; import java.text.*; public class JobCandidateSort { public static void main...

    Java用Comparator来排序.pdf

    本文将深入探讨如何使用Comparator接口来对Java列表进行自定义排序,并介绍相关的编程概念。 首先,`Comparator`接口在Java中扮演着重要的角色,它允许用户自定义对象的比较规则。`Comparator&lt;T&gt;`接口有一个核心...

    Comparator 排序器

    此外,由于`Comparator`允许传递多个实例,因此可以很容易地实现多级排序或其他更复杂的排序需求。 综上所述,`Comparator`接口为Java开发者提供了一种高效且灵活的方式来控制对象的排序顺序,使得数据管理变得更加...

    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中list排序

    Java 中 List 排序 Java 中 List 排序是指在数据库中查出来的列表中对不同的字段重新排序。...这种方法可以实现对 List 中的对象进行排序,而不需要写多个比较方法。这可以使我们的代码变得更加简洁和灵活。

    Java排序算法包 支持自定义比较条件

    这个"Java排序算法包"提供了对多种排序算法的支持,并且允许用户根据自己的需求自定义比较条件,使得排序功能更加灵活。 1. **排序算法基础**: - 排序是指将一组数据按照特定的顺序进行排列的过程。常见的排序...

    Java源码对用户名进行比较排序.rar

    在Java编程语言中,对用户名进行比较排序是一个常见的任务,特别是在开发用户管理系统或者任何涉及到用户数据展示的应用中。这个任务通常涉及到字符串的比较和排序,Java提供了强大的工具来实现这一功能。下面我们将...

    java 大文件 多字段排序

    在Java编程中,处理大文件并进行多字段排序是一项挑战性的任务,特别是在内存有限的情况下。以下将详细讲解如何实现这个目标。 首先,我们要理解大文件排序的基本原理。当文件太大无法一次性加载到内存时,我们需要...

    Java中Comparable和Comparator的区别

    Comparator则适用于需要动态调整排序策略或多个排序条件的场景。 4. 泛型参数:Comparable的泛型参数是类自身(`compareTo(T o)`),而Comparator的泛型参数可以是任意类型(`compare(T o1, T o2)`),因此...

    文件按照window 的排序规则-Java实现

    如果`quiz`是一个文件,那么它本身不能直接参与排序,但如果我们有一个包含多个文件的目录`quiz`,可以按照上述方法对`quiz`目录下的文件进行排序。 7. **注意点**: - 文件路径应正确处理,避免路径分隔符问题。 ...

    Java读取文件并对其排序后重新写入文件

    在Java编程中,读取文件、对数据进行排序并重新写入文件是常见的操作,尤其在数据处理和分析场景中。下面将详细讲解这个过程,包括相关知识点和具体实现。 首先,我们需要导入Java的`java.io`包,该包包含了处理...

    List对象集合的排序:比较器Comparator(简单例子)

    此外,`Comparator`还支持链式调用,可以同时比较多个属性,比如先比较年龄再比较姓名: ```java persons.sort(Comparator.comparing(Person::getAge) .thenComparing(Person::getName)); ``` 这样,`List`对象...

Global site tag (gtag.js) - Google Analytics