工作中遇到按照類的某個屬性排列,這個屬性是個枚舉類型,按照要求的優先級排列。
可以使用ComparatorChain、BeanComparator、FixedOrderComparator實現。
舉一個例子:
學生類:包含姓名、年齡、性別、性格。性格是個枚舉類型。
性格類:枚舉類型,分為四類:內向,外向,太監,不知道四種類型。
SortUtil類:排序類。
Student.java
- 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類:
- 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類:
- 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定義,性格相同按照年齡,所以:
- <span style="white-space:pre"> </span>moInfoComparator.addComparator(new BeanComparator("character",TypeComparator));
- moInfoComparator.addComparator(new BeanComparator("age"),true);
- moInfoComparator.addComparator(new BeanComparator("name"));
- moInfoComparator.addComparator(new BeanComparator("sex"));
這四句話的順序決定了先已哪個屬性排序。