当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序。 
 
  
 
1.通过实现Comparable接口,根据User的年龄进行排序。 
 
  
 
Java代码   
1.import java.util.Arrays;    
2.   
3./**   
4. * @author pengcqu   
5. *    
6. */   
7.public class ComparableUser implements Comparable {    
8.   
9.    private String id;    
10.    private int age;    
11.   
12.    public ComparableUser(String id, int age) {    
13.        this.id = id;    
14.        this.age = age;    
15.    }    
16.   
17.    public int getAge() {    
18.        return age;    
19.    }    
20.   
21.    public void setAge(int age) {    
22.        this.age = age;    
23.    }    
24.   
25.    public String getId() {    
26.        return id;    
27.    }    
28.   
29.    public void setId(String id) {    
30.        this.id = id;    
31.    }    
32.   
33.    public int compareTo(Object o) {    
34.        return this.age - ((ComparableUser) o).getAge();    
35.    }    
36.   
37.    /**   
38.     * 测试方法   
39.     */   
40.    public static void main(String[] args) {    
41.        ComparableUser[] users = new ComparableUser[] {    
42.                new ComparableUser("u1001", 25),    
43.                new ComparableUser("u1002", 20),    
44.                new ComparableUser("u1003", 21) };    
45.        Arrays.sort(users);    
46.        for (int i = 0; i < users.length; i++) {    
47.            ComparableUser user = users[i];    
48.            System.out.println(user.getId() + " " + user.getAge());    
49.        }    
50.    }    
51.   
52.}   
import java.util.Arrays; 
 
/** 
 * @author pengcqu 
 *  
 */ 
public class ComparableUser implements Comparable { 
 
        private String id; 
        private int age; 
 
        public ComparableUser(String id, int age) { 
                this.id = id; 
                this.age = age; 
        } 
 
        public int getAge() { 
                return age; 
        } 
 
        public void setAge(int age) { 
                this.age = age; 
        } 
 
        public String getId() { 
                return id; 
        } 
 
        public void setId(String id) { 
                this.id = id; 
        } 
 
        public int compareTo(Object o) { 
                return this.age - ((ComparableUser) o).getAge(); 
        } 
 
        /** 
         * 测试方法 
         */ 
        public static void main(String[] args) { 
                ComparableUser[] users = new ComparableUser[] { 
                                new ComparableUser("u1001", 25), 
                                new ComparableUser("u1002", 20), 
                                new ComparableUser("u1003", 21) }; 
                Arrays.sort(users); 
                for (int i = 0; i < users.length; i++) { 
                        ComparableUser user = users[i]; 
                        System.out.println(user.getId() + " " + user.getAge()); 
                } 
        } 
 
}  
 
  
 
2. 通过实现Comparator接口,根据User的年龄进行排序。 
 
  
 
Java代码   
1.public class User {    
2.   
3.    private String id;    
4.    private int age;    
5.   
6.    public User(String id, int age) {    
7.        this.id = id;    
8.        this.age = age;    
9.    }    
10.   
11.    public int getAge() {    
12.        return age;    
13.    }    
14.   
15.    public void setAge(int age) {    
16.        this.age = age;    
17.    }    
18.   
19.    public String getId() {    
20.        return id;    
21.    }    
22.   
23.    public void setId(String id) {    
24.        this.id = id;    
25.    }    
26.        
27.   
28.}   
public class User { 
 
        private String id; 
        private int age; 
 
        public User(String id, int age) { 
                this.id = id; 
                this.age = age; 
        } 
 
        public int getAge() { 
                return age; 
        } 
 
        public void setAge(int age) { 
                this.age = age; 
        } 
 
        public String getId() { 
                return id; 
        } 
 
        public void setId(String id) { 
                this.id = id; 
        } 
         
 
}  
 
Java代码   
1.import java.util.Arrays;    
2.import java.util.Comparator;    
3.   
4./**   
5. * @author pengcqu   
6. *    
7. */   
8.public class UserComparator implements Comparator {    
9.   
10.    public int compare(Object arg0, Object arg1) {    
11.        return ((User) arg0).getAge() - ((User) arg1).getAge();    
12.    }    
13.   
14.    /**   
15.     * 测试方法   
16.     */   
17.    public static void main(String[] args) {    
18.        User[] users = new User[] { new User("u1001", 25),    
19.                new User("u1002", 20), new User("u1003", 21) };    
20.        Arrays.sort(users, new UserComparator());    
21.        for (int i = 0; i < users.length; i++) {    
22.            User user = users[i];    
23.            System.out.println(user.getId() + " " + user.getAge());    
24.        }    
25.    }    
26.}   
import java.util.Arrays; 
import java.util.Comparator; 
 
/** 
 * @author pengcqu 
 *  
 */ 
public class UserComparator implements Comparator { 
 
        public int compare(Object arg0, Object arg1) { 
                return ((User) arg0).getAge() - ((User) arg1).getAge(); 
        } 
 
        /** 
         * 测试方法 
         */ 
        public static void main(String[] args) { 
                User[] users = new User[] { new User("u1001", 25), 
                                new User("u1002", 20), new User("u1003", 21) }; 
                Arrays.sort(users, new UserComparator()); 
                for (int i = 0; i < users.length; i++) { 
                        User user = users[i]; 
                        System.out.println(user.getId() + " " + user.getAge()); 
                } 
        } 
} 
  
 
选择Comparable接口还是Comparator? 
 
 一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。 
 
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 
2、可以使用多种排序标准,比如升序、降序等。 
 
 |