ComparatorChain、BeanComparator用法示例(枚举类型排序转)
工作中遇到按照类的某个属性排列,这个属性是个枚举类型,按照要求的优先级排列。
可以使用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用法示例(枚举类型排序转)的更多相关文章
- Java练习 SDUT-1959_简单枚举类型——植物与颜色
简单枚举类型--植物与颜色 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定义具有red, orange, yell ...
- C语言——枚举类型用法
1.枚举的定义 enum 枚举名{ 枚举元 素1,枚举元素2,枚举元素3...}: 2.使用枚举类型的好处 增加程序的可读性,我们都知道在计算机中所有信息都是用二进制来表示的,如果你用二进制来表示某件 ...
- C#中的枚举类型enum用法
定义一个简单的枚举类型: enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; //这时候 Days.Sat = 0 ,后面依 ...
- enum枚举类型 的用法
1.作为数组下标使用 enun box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[rule ...
- C++枚举类型Enum及C++11强枚举类型用法
C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- Java枚举类型使用示例
Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...
- MyBatis(八):Mybatis Java API枚举类型转化的用法
最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
随机推荐
- jar MANIFEST.MF 汇总
: Manifest-Version: 1.0Created-By: Apache Ant 1.5.1Extension-Name: Struts FrameworkSpecification-Tit ...
- php 数组操作
<?php $vegetables[0] = "corn"; $vegetables[1] = "broccoli"; $vegetables[2] = ...
- IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
*********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...
- 【液晶模块系列基础视频】5.1X-GUI字体驱动1
============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...
- Apache Spark源码走读之4 -- DStream实时流数据处理
欢迎转载,转载请注明出处,徽沪一郎. Spark Streaming能够对流数据进行近乎实时的速度进行数据处理.采用了不同于一般的流式数据处理模型,该模型使得Spark Streaming有非常高的处 ...
- DS实验题 Floyd最短路径 & Prim最小生成树
题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...
- Linux PHP增加JSON支持及如何使用JSON
Linux PHP增加JSON支持及如何使用JSON 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. JSON(JavaScript Object Notation) ...
- 性能测试工具JMeter
JMeter介绍 Apache JMeter是Apache组织的开放源代码项目,具有极高的可扩展性,是一个100%纯Java桌面应用,用于压力/性能测试.JMeter可以用于测试静态或者动态资 ...
- 实时查看linux网卡流量
将下列脚本保存为可执行脚本文件,比如叫traff.sh. 1.本脚本可自定义欲查看接口,精确到小数,并可根据流量大小灵活显示单位. 2.此脚本的采集间隔为1秒. 3.此脚本不需要额外再安装软件,可在急 ...
- .gitignore 配置
.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得. 1.配置语法: 以斜杠“/”开头 ...