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`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
在Java编程中,对List进行多个排序和查询条件的处理是一项常见的任务,特别是在处理数据集合时。本篇文章将深入探讨如何使用Java实现这些操作,并基于给出的`GroupFilterSortUtils.java`文件,我们可以推断这是一个...
在实际开发中,使用Comparator接口可以解决许多排序问题,例如按照复杂的业务规则排序、按照多个字段排序等等。 Comparator接口提供了很高的灵活性和可扩展性,满足了我们对对象排序的需求。 JAVA使用Comparator...
此外,Comparator还可以通过`thenComparing()`方法进行链式比较,这样可以实现多个条件的排序。例如,如果年龄相同,我们可以按照姓名排序: ```java userList.sort(Comparator.comparing(User::getAge) ....
本文将深入探讨如何在Java的List中对包含多个属性的对象进行排序,并且支持动态设置每个属性的排序方式。这个功能的实现是通过泛型和自定义比较器(Comparator)来完成的,对于复杂的数据排序需求具有很高的灵活性。...
在Java编程中,对象数组排序是一项常见的任务,...以上就是关于“JAVA 对象数组按照多个属性进行排序”的详细解析,希望对你理解Java排序机制有所帮助。在实际开发中,灵活运用这些技巧可以提高代码的可维护性和效率。
当我们需要对一个集合或数组中的非数值类型对象进行排序,或者需要根据对象的多个属性进行复杂排序时,Comparator 就派上了用场。 Comparator 接口有一个核心方法 `compare(T o1, T o2)`,这个方法返回一个整数值,...
如果我们需要对一个对象列表中的某个字段(如年龄)进行排序,可以创建一个 `Comparator` 实现。 ```java import java.util.*; import java.text.*; public class JobCandidateSort { public static void main...
本文将深入探讨如何使用Comparator接口来对Java列表进行自定义排序,并介绍相关的编程概念。 首先,`Comparator`接口在Java中扮演着重要的角色,它允许用户自定义对象的比较规则。`Comparator<T>`接口有一个核心...
此外,由于`Comparator`允许传递多个实例,因此可以很容易地实现多级排序或其他更复杂的排序需求。 综上所述,`Comparator`接口为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 排序是指在数据库中查出来的列表中对不同的字段重新排序。...这种方法可以实现对 List 中的对象进行排序,而不需要写多个比较方法。这可以使我们的代码变得更加简洁和灵活。
这个"Java排序算法包"提供了对多种排序算法的支持,并且允许用户根据自己的需求自定义比较条件,使得排序功能更加灵活。 1. **排序算法基础**: - 排序是指将一组数据按照特定的顺序进行排列的过程。常见的排序...
在Java编程语言中,对用户名进行比较排序是一个常见的任务,特别是在开发用户管理系统或者任何涉及到用户数据展示的应用中。这个任务通常涉及到字符串的比较和排序,Java提供了强大的工具来实现这一功能。下面我们将...
在Java编程中,处理大文件并进行多字段排序是一项挑战性的任务,特别是在内存有限的情况下。以下将详细讲解如何实现这个目标。 首先,我们要理解大文件排序的基本原理。当文件太大无法一次性加载到内存时,我们需要...
Comparator则适用于需要动态调整排序策略或多个排序条件的场景。 4. 泛型参数:Comparable的泛型参数是类自身(`compareTo(T o)`),而Comparator的泛型参数可以是任意类型(`compare(T o1, T o2)`),因此...
如果`quiz`是一个文件,那么它本身不能直接参与排序,但如果我们有一个包含多个文件的目录`quiz`,可以按照上述方法对`quiz`目录下的文件进行排序。 7. **注意点**: - 文件路径应正确处理,避免路径分隔符问题。 ...
在Java编程中,读取文件、对数据进行排序并重新写入文件是常见的操作,尤其在数据处理和分析场景中。下面将详细讲解这个过程,包括相关知识点和具体实现。 首先,我们需要导入Java的`java.io`包,该包包含了处理...
此外,`Comparator`还支持链式调用,可以同时比较多个属性,比如先比较年龄再比较姓名: ```java persons.sort(Comparator.comparing(Person::getAge) .thenComparing(Person::getName)); ``` 这样,`List`对象...