如何实现按照List集合中对象某个属性排序?

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

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


举一个例子:

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

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

SortUtil类:排序类。


Student.java

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

 

Character类:

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

SortUtil类:

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

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

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

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

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

结果:



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

  1. <span style="white-space:pre">            </span>moInfoComparator.addComparator(new BeanComparator("character",TypeComparator));  
  2.             moInfoComparator.addComparator(new BeanComparator("age"),true);  
  3.             moInfoComparator.addComparator(new BeanComparator("name"));  
  4.             moInfoComparator.addComparator(new BeanComparator("sex"));  

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

posted @ 2016-05-06 11:20  千古风流人物  阅读(6118)  评论(1编辑  收藏  举报