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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘佳 中级黑马   /  2012-9-4 16:52  /  1660 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘佳 于 2012-9-5 19:34 编辑

什么时候使用接口Comparable,什么时候使用Comparator接口,两者之间有何区别?

评分

参与人数 1黑马币 +30 收起 理由
田建 + 30 类似的问题太多!

查看全部评分

4 个回复

倒序浏览
TreeSet的排序方式有下面两种:
1:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。
    也种方式也成为元素的自然顺序,或者叫做默认顺序。
class Student implements Comparable//该接口强制让学生类具备比较性
{  Student()
    {}
    public int compareTo(Object obj)
    {}
}

2:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
    在集合初始化时,就有了比较方式。
    这时就需要定义一个比较器类去实现Comparator,并重写compare方法。
class MyCompare implements Comparator  //自定义比较器,使集合具备比较性
{  public int compare(Object o1,Object o2)
    {}
}

在定义集合时,需要根据实际情况选择排序方式:
1、TreeSet ts =new TreeSet(); //此时的排序方式为第一种,即元素的自然排序方式。
2、TreeSet ts =new TreeSet(new MyCompare()); //此时的排序方式为第二种,即集合自身具备比较性。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
在TreeSet中
                        底层数据结构是二叉树,线程不安全。
                        所以为了实现保证元素的排序!两种方式
                        A:让元素本身具备比较性
                                **实现Compareable接口中的compareTo方法。
                        B:让集合具备比较性
                                **实现Comparator接口中的compare方法
  所以一个是定义在集合接口中使用的,一个是为某个对象本身具有比较方法而定义的。
  Comparator 是比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
  Comparable
====================
import java.util.TreeSet;
import java.util.Iterator;

public class Student implements Comparable<Student> {
        private int id;
        private String name;

        public Student (int id, String name) {
                this.id = id;
                this.name = name;
        }

        public void setId (int id) {
                this.id = id;
        }

        public void setName (String name) {
                this.name = name;
        }

        public int getId () {
                return id;
        }

        public String getName () {
                return name;
        }

        /* Student 类的字符串表达式,形如:
         * 2   张三 */

        public String toString () {
                return (id + "\t" + name);
        }

        /* 实现 Comparable 接口中的 compareTo 方法,
         * 通常大于时返回一个正数,小于时返回一个负数,
         * 等于时返回零,具体情况可以自行决定。  *********************************************************
         * 这里我根据 id 号的大小进行了比较。由于 TreeSet
         * 会根据 compareTo 的结果来排序,因此输出结果
         * 应该是按照 id 号从小到大排序的。
         * 如果要根据姓名进行排序,只需对这个方法进行相应的修改。*/

        public int compareTo (Student arg) {
                if (id > arg.id)
                        return 1;
                else if (id == arg.id)
                        return 0;
                else
                        return -1;
        }

        /* 以下为主方法,输出结果是:
         * 3     John
         * 5     Tom
         * 7     Alice
         * 9     David
         * 可以看到不同于输入顺序,
         * TreeSet 已经将其排序了。*/

        public static void main (String args[]) {
                TreeSet<Student> tset = new TreeSet<Student>();
                tset.add(new Student(5, "Tom"));
                tset.add(new Student(3, "John"));
                tset.add(new Student(9, "David"));
                tset.add(new Student(7, "Alice"));

                Iterator<Student> itor = tset.iterator();
                while (itor.hasNext()) {
                        System.out.println(itor.next().toString());
                }
        }
}
回复 使用道具 举报
Comparable是放入框架的类先要具备比较性要继承的,不然就无法排序,因为框架是调用该类的compareTo方法来比较的,这样的话,一个类只有一种比较的方法

而 Comparator是框架自己的比较器,通过定义类实现该接口来定义比较器,这时一个单独的比较器,可以通过这样的方法定义很多比较器,只要符合规则都可以通过相应比较器来比较排序。这样就比较灵活
回复 使用道具 举报
Comparator 和 Comparable 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序。
所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)。
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

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