`
nuistcc
  • 浏览: 84186 次
社区版块
存档分类
最新评论

Comparator多级排序

阅读更多

       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接口来自定义排序规则,以实现更灵活的排序功能。 Comparator接口位于java.util包中,它允许我们为Java集合框架中未实现Comparable接口的对象提供一个“比较器”。比较器本质上是...

    Comparator 排序器

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

    java集合排序方法总结共13页.pdf.zip

    对于更复杂的排序需求,如多级排序或根据多个字段排序,我们可以使用Comparator的`thenComparing()`方法链式调用来实现。 ```java Comparator&lt;MyObject&gt; comparator = Comparator.comparing(MyObject::getAge) ....

    排序TableModel

    当你调用`setSortKeys(List)`方法时,可以设置多个排序条件,实现多级排序。 3. **触发排序**:当用户点击表头时,`JTable`会自动调用`sort()`方法,根据当前的排序模型对数据进行排序。如果你需要在代码中触发排序...

    javascript方法让表格按表头中某列排序,同excel功能

    6. **处理多级排序**:为了实现类似Excel的多级排序,我们需要维护一个排序历史记录,每次点击表头时,根据当前列和之前的排序方向更新排序。 以上是一个基本的表格排序实现框架,但实际应用中可能还需要考虑其他...

    java8-像使用SQL一样排序集合.pdf

    `thenComparing()` 方法允许我们链式调用多个比较器,以实现多级排序。这个功能在处理复杂数据结构时非常有用,可以轻松地根据对象的不同属性进行排序。 总结来说,Java 8 的集合排序功能使得对数据的操作更加高效...

    secondary-sort:Apache Crunch中辅助排序的演示

    辅助排序允许我们在MapReduce作业中实现多级排序,这是标准的key-value排序所无法实现的。在Hadoop默认的排序过程中,每对键值会被按照键进行排序,但有时我们需要对相同键下的值也进行排序,这就是辅助排序的作用。...

    Java构建树形菜单的实例代码(支持多级菜单)

    为了对菜单进行排序,我们可以创建一个`Comparator&lt;Menu&gt;`,根据`Menu`类中的`order`字段来比较两个菜单对象。这样,菜单将按照顺序字段进行升序排列: ```java public Comparator&lt;Menu&gt; order() { return new ...

    Java基础入门_课后题答案_仅供参考.docx

    12. **自定义排序算法**:可以实现`Comparator`接口,重写`compare()`方法,然后手动调用排序算法。 13. **Collection子类**:包括`List`(ArrayList, LinkedList等)和`Set`(HashSet, TreeSet等),各有其特点,如...

    Java基础入门_课后题答案_仅供参考.pdf

    7. 自定义排序算法:可以实现Comparator接口,重写compare()方法,然后用Collections.sort()或Arrays.sort()进行排序。 8. 递归删除多级文件夹:使用递归遍历文件夹,对每个文件或子文件夹调用`Files.delete()`方法...

    进程调度的两种算法JAVA实现----FCFS(先来先服务)和SJF(最短作业优先)

    这里使用了`PriorityQueue`,并提供一个`Comparator`来比较进程的执行时间,从而实现SJF的优先级排序。 **总结** FCFS和SJF都是基于简单原则的调度策略,它们各有优缺点。FCFS简单直观,但可能导致短进程等待时间...

    action源码java-MyJava8InAction:我的学习笔记“Java8InAction”。可以在https://github.co

    例如,`Comparator`接口增加了一个`thenComparing()`方法,使得多级排序变得简单: ```java List&lt;Person&gt; people = ...; people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge)); ``` ...

    level db实现解析

    3. **SSTable**:SSTable文件是由一系列键值对组成的数据文件,按字典序排序,并通过索引进行快速查找。 4. **Block of Log**:日志文件中的数据也是以块的形式存储,主要用于记录写操作,确保数据的一致性和持久性...

    jdk8中英对照API.zip

    例如,`java.util.Comparator`接口添加了`thenComparing()`等方法,方便多级比较。 反射API也有所增强,现在可以更方便地获取枚举常量的名称和顺序,以及对方法和构造器的默认访问权限。 在集合框架方面,`Map`...

    Java创建树形结构算法实例代码

    这里使用了`Collections.sort()`方法,并传入自定义的比较器`Comparator&lt;MenuExt&gt;`,比较器根据`ordby`字段进行比较,如果`ordby`为空,则根据`id`进行排序,确保了菜单的正确排列。 接下来,我们看如何使用算法将...

    leveldb实现解析

    - **Comparator**:比较器接口,用于比较两个内部键的顺序,实现于 `comparator.h` 和 `comparator.cc`。 - **InternalKeyComparator**:基于内部键的比较器,专门用于比较内部键。 - **WriteBatch**:批量写操作...

    JDK8MOOC:JDK 8大规模开放和在线课程的项目

    例如,`Comparator`接口中的`thenComparing()`就是默认方法,它允许我们轻松地创建多级比较器。 **6. 新的集合操作:** JDK 8对集合接口进行了扩展,添加了如`map()`、`flatMap()`、`forEach()`等方法,使得集合...

Global site tag (gtag.js) - Google Analytics