工作中遇到按照类的某个属性排列,这个属性是个枚举类型,按照要求的优先级排列。

可以使用ComparatorChain、BeanComparator、FixedOrderComparator实现。

举一个例子:

学生类:包含姓名、年龄、性别、性格。性格是个枚举类型。

性格类:枚举类型,分为四类:内向,外向,太监,不知道四种类型。

SortUtil类:排序类。

Student.java

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.ArrayList;  
import java.util.List;  
  
public class Student {  
      
    private String name;  
    private int age;  
    private boolean sex;  
    private Character character;  
      
    public Student(String name, int age, boolean sex, Character character){  
        this.name = name;  
        this.age = age;  
        this.sex = sex;  
        this.character = character;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getName() {  
        return name;  
    }  
      
    public void setAge(int age) {  
        this.age = age;  
    }  
    public int getAge() {  
        return age;  
    }  
      
    public void setSex(boolean sex) {  
        this.sex = sex;  
    }  
    public boolean getSex() {  
        return sex;  
    }  
      
    public void setCharacter(Character character) {  
        this.character = character;  
    }  
    public Character getCharacter() {  
        return character;  
    }     
      
    @Override  
    public String toString() {  
        String sexString = sex == false ? "male" : "female";  
        return "名字:" + name + " 年龄: " + age + " 性别: " + sexString + " 性格: " + character;  
    }  
      
    public static void main(String args[]) {  
        Student student1 = new Student("spring", 20, false, Character.IN);  
        Student student2 = new Student("summer", 18, false, Character.OUT );  
        Student student3 = new Student("automn", 25, false, Character.UNKNOWN );  
        Student student4 = new Student("winter", 25, true, Character.UNKNOWN);  
          
        List<Student> list1 = new ArrayList<Student>();  
        list1.add(student1);  
        list1.add(student3);  
        list1.add(student2);  
        list1.add(student4);  
          
        System.out.println("没有排序之前:");  
        for(Student student : list1) {  
            System.out.println(student);  
        }  
          
        SortUtil.sortByWhat(list1);  
          
        System.out.println("排序之后:");  
        for(Student student : list1) {  
            System.out.println(student);  
        }  
          
              
    }  
  
}  

Character类:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public enum Character {  
  
    IN("内向"),  
    OUT("外向"),  
    BOTH("太监"),  
    UNKNOWN("不知道");  
      
    private String name;  
  
    private Character(String name) {  
        this.name = name;  
  
    }  
      
    public String getName() {  
        return name;  
    }     
      
    public String toString() {  
        return name;  
    }  
  
}

SortUtil类:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  
import org.apache.commons.beanutils.BeanComparator;  
import org.apache.commons.collections.comparators.ComparatorChain;  
import org.apache.commons.collections.comparators.FixedOrderComparator;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
  
public class SortUtil {  
      
    private static final Log Logger = LogFactory.getLog(SortUtil.class);  
      
    @SuppressWarnings("unchecked")  
    public static void sortByWhat(List<Student> list){  
        try{  
            Character[] CharacterType = {Character.UNKNOWN,Character.IN ,Character.OUT,Character.BOTH};  
            Comparator TypeComparator = new FixedOrderComparator(CharacterType);  
              
            ComparatorChain moInfoComparator = new ComparatorChain();  
              
            moInfoComparator.addComparator(new BeanComparator("character",TypeComparator));  
            moInfoComparator.addComparator(new BeanComparator("age"),true);  
            moInfoComparator.addComparator(new BeanComparator("name"));  
            moInfoComparator.addComparator(new BeanComparator("sex"));  
              
            Collections.sort(list, moInfoComparator);  
        } catch (Exception e) {  
            Logger.error(e.getMessage());  
        }         
    }  
  
}

moInfoComparator.addComparator(new BeanComparator(“character”,TypeComparator));  

这个类中首先按照性格属性来排序,利用FixedOrderComparator设置优先级,性格属性Character.UNKOWN排第一,

然后IN,其次OUT,最后BOTH。如果性格属性相同,按照age排序,true表示逆序(默认排序是从小到大),然后按

照name,最后按照sex属性排序。

需要导入commons-beanutils,commons-logging,commons-collections包。

结果:

可以看到排序之后首先按照性格排序,性格是枚举类型,排序规则用FixedOrderComparator定义,性格相同按照年龄,所以:

 
 
 
 
 

Java

 
1
2
3
moInfoComparator.addComparator(new BeanComparator("age"),true);  
moInfoComparator.addComparator(new BeanComparator("name"));  
moInfoComparator.addComparator(new BeanComparator("sex"));

这四句话的顺序决定了先已哪个属性排序。

ComparatorChain、BeanComparator用法示例(枚举类型排序转)的更多相关文章

  1. Java练习 SDUT-1959_简单枚举类型——植物与颜色

    简单枚举类型--植物与颜色 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定义具有red, orange, yell ...

  2. C语言——枚举类型用法

    1.枚举的定义 enum 枚举名{ 枚举元 素1,枚举元素2,枚举元素3...}: 2.使用枚举类型的好处 增加程序的可读性,我们都知道在计算机中所有信息都是用二进制来表示的,如果你用二进制来表示某件 ...

  3. C#中的枚举类型enum用法

    定义一个简单的枚举类型:   enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};        //这时候         Days.Sat = 0 ,后面依 ...

  4. enum枚举类型 的用法

    1.作为数组下标使用 enun  box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[rule ...

  5. C++枚举类型Enum及C++11强枚举类型用法

    C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...

  6. Java枚举类型的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...

  7. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  8. MyBatis(八):Mybatis Java API枚举类型转化的用法

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  9. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

随机推荐

  1. mysql 常用知识

    1.uuid guid UUID是一个由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长.比如:550e8400-e29b-41d4-a716-446655440000 CH ...

  2. Careercup | Chapter 7

    7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...

  3. 通过Powershell开启RDP

    1) Enable Remote Desktop set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Ser ...

  4. java命令行参数

    命令行参数就是main方法里面的参数String[] args他就是一个数组,args只是数据类型的一个名称,就是一个数组的变量,名称无所谓,类型没变就行了.这个就是程序的入口点.如图7.4所示: 图 ...

  5. HDU 1025 Constructing Roads In JGShining's Kingdom(二维LIS)

    Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  6. 随机(Random)

    随机(Random)随机是智能的基础,人工智能的很多技术都需要用到随机,因此有必要把这个提到前面谈谈一考虑基于C/C++,般我们都是使用的rand ()等函数实现随机,当然我们也有吊炸天的boost库 ...

  7. 利用EXCEL表实现网页数据采集到MYSQL数据库

    先复制页面表格数据到EXCEL中,比如 2012-1-4 52.7 52.7 49 48.83 190007 9506968 2012-1-5 48.86 49.79 45.72 45.6 62325 ...

  8. selenium测试套件

    1.测试套件测试套件,简单理解就是讲多个用例,装在一个容器里来同时执行完成. 2.测试套件分析 #coding=utf-8 import unittestimport BaiDuSearch,BaiD ...

  9. BAT批处理(二)

    在前一篇中已对BAT批处理基础作了一些总结,但是对于BAT批处理还有很多的知识点没有讲解到,比如DOS中的特殊符号:IF.FOR的使用:变量:更多的DOS命令等等.本文在前一篇的基础上继续对BAT批处 ...

  10. lvs nginx HAProxy优缺点

    LVS的优点:1、抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;2、工作稳定,自身有完 ...