A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李凤鸣 中级黑马   /  2012-12-13 22:33  /  1793 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

电子书是这么写的:
Comparator强行对某个对象 collection 进行整体排序 的比较函数

Comparable强行对实现它的每个类的对象进行整体排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort进行自动排序

可我还是有些不明白

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序。



1.通过实现Comparable接口,根据User的年龄进行排序。


Java代码  收藏代码

    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代码  收藏代码

    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代码  收藏代码

    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、可以使用多种排序标准,比如升序、降序等。
回复 使用道具 举报 1 0

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)   
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

comparable和  Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,
所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
Comparable   &   Comparator   都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法   或   在集合内实现Comparable接口的方法。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Comparable是对象自身的排序 覆盖CompareTo方法
Comparator是对象比较器 覆盖Compare方法
如果两者都存在的话 使用的是Comparator  Comparator使用频率高些

以上个人理解

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马