轉自:http://blog.csdn.net/memewry/article/details/7907012
Collections.sort( )分爲兩部分,一部分爲排序規則,一部分爲排序算法 。
規則用來判斷對象,算法則考慮如何進行排序
對於自定義對象,sort()不知道規則,所以無法比較,這種情況下一定要定義排序規則。方式有兩種:
第一種,java.lang下面的一個接口:Comparable。可以讓自定義對象實現一個Comparable接口,這個接口只有一個方法comparableTo(Object o)
其規則是當前對象與o對象進行比較,返回一個int值,系統根據此值進行排序。
如當前對象>o對象,則返回值>0;
如當前對象=o對象,則返回值=0;
如當前對象<o對象,則返回值<0;
- import java.util.*;
- class User implements Comparable<User>
- {
- private String name;
- private Integer order;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getOrder() {
- return order;
- }
- public void setOrder(Integer order) {
- this.order = order;
- }
- public int compareTo(User arg0) {
- return this.getOrder().compareTo(arg0.getOrder());
- }
- }
- public class Test{
- public static void main(String[] args) {
- User user1 = new User();
- user1.setName("zhangsan");
- user1.setOrder(10);
- User user2 = new User();
- user2.setName("lisi");
- user2.setOrder(6);
- User user3 = new User();
- user3.setName("wangwu");
- user3.setOrder(11);
- User user4 = new User();
- user4.setName("zhaoqi");
- user4.setOrder(2);
- List<User> list = new ArrayList<User>();
- list.add(user1);
- list.add(user2);
- list.add(user3);
- list.add(user4);
- Collections.sort(list);
- for(User u : list){
- System.out.println(u.getName());
- }
- }
- }
第二種方式,java.util下有一個Comparator(比較器)。它擁有compare( )方法,用來比較兩個對象。
- import java.util.*;
- class User { //此處無需實現Comparable接口
- private String name;
- private Integer order;
- public User(){};
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getOrder() {
- return order;
- }
- public void setOrder(Integer order) {
- this.order = order;
- }
- }
- public class Test2{
- public static void main(String[] args) {
- User user1 = new User();
- user1.setName("zhangsan");
- user1.setOrder(10);
- User user2 = new User();
- user2.setName("lisi");
- user2.setOrder(6);
- User user3 = new User();
- user3.setName("wangwu");
- user3.setOrder(11);
- User user4 = new User();
- user4.setName("zhaoqi");
- user4.setOrder(2);
- List<User>list = new ArrayList<User>();
- list.add(user2);
- list.add(user1);
- list.add(user3);
- list.add(user4);
- Collections.sort(list,new Comparator<User>(){
- public int compare(User arg0, User arg1) {
- return arg0.getOrder().compareTo(arg1.getOrder());
- }
- });
- for(User u : list){
- System.out.println(u.getName());
- }
- }
- }
前者代碼結構簡單,但是隻能根據固定的屬性排序,後者靈活,可以臨時指定排序項,但是代碼不夠簡潔。
多字段比較:
- Collections.sort(list,new Comparator <user>(){
- public int compare(User arg0, User arg1) {
- // 第一次比較專業
- int i = arg0.getOrder().compareTo(arg1.getOrder());
- // 如果專業相同則進行第二次比較
- if(i==0){
- // 第二次比較學制
- int j=arg0.getXXX().compareTo(arg1.getXXX());
- // 如果學制相同則返回按年齡排序
- if(j==0){
- return arg0.getCCC().compareTo(arg1.getCCC());
- }
- return j;
- }
- return i;
- }
- });