如何實現按照List集合中對象某個屬性排序?


工作中遇到按照類的某個屬性排列,這個屬性是個枚舉類型,按照要求的優先級排列。

可以使用ComparatorChain、BeanComparator、FixedOrderComparator實現。


舉一個例子:

學生類:包含姓名、年齡、性別、性格。性格是個枚舉類型。

性格類:枚舉類型,分為四類:內向,外向,太監,不知道四種類型。

SortUtil類:排序類。


Student.java

[java] view plain copy
  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類:

[java] view plain copy
  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類:

[java] view plain copy
  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. }  
[java] view plain copy
  1. moInfoComparator.addComparator(new BeanComparator("character",TypeComparator));  

這個類中首先按照性格屬性來排序,利用FixedOrderComparator設置優先級,性格屬性Character.UNKOWN排第一,

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

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

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

結果:



可以看到排序之后首先按照性格排序,性格是枚舉類型,排序規則用FixedOrderComparator定義,性格相同按照年齡,所以:

[java] view plain copy
  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"));  

這四句話的順序決定了先已哪個屬性排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM