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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄佳 中级黑马   /  2012-10-12 15:50  /  2210 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄佳 于 2012-10-12 19:05 编辑



Comparator  和  Comparable   的区别是什么?   

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

6 个回复

倒序浏览
   Comparetor    返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null.
        Comparable    此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

评分

参与人数 1黑马币 +2 收起 理由
黄佳 + 2 赞一个!

查看全部评分

回复 使用道具 举报
|----TreeSet:可以对Set集合中的元素进行排序。
       底层数据结构是二叉树
       保证元素唯一性的依据:compareTo方法return 0.
       TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序,或者叫默认排序。
TreeSet排序的第二种方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让容器自身(集合)具备比较性。自定义比较器(定义一个类实现Comparator接口,覆盖compare方法),将之作为参数传递给TreeSet的构造方法,这样在TreeSet集合初始化时,就有了比较方式。
当两种排序都存在时,以比较器为主。
回复 使用道具 举报
1.继承这两个接口后所实现的方法不一样
2Comparable强行对实现它的每个类的对象进行整体排序----自然排序  他是让存入集合的元素自身一一定的比较性 我们只要实现这个接口后重写相关的方法即可 集合底层会自动帮我们调用。
3.而当元素自身没有可比性或者 元素的比较性不是我们想要的这时我们可以使用Comparator接口 并且要将接口的子类对象传到集合中  Comparator是让集合有可比性

评分

参与人数 1黑马币 +1 收起 理由
黄佳 + 1 赞一个!

查看全部评分

回复 使用道具 举报
import java.util.*;

/*
当元素自身不具备比较性时,或者具备的不是所需要的
  这是需要让容器具备比较性
  定义比较器,将比较器传递给treeset集合的构造函数
  但两种排序都存在,一比较器为主
*/
class Student implements Comparable//在tree中学生类必须要实现comparable接口是他具备强制的比较性
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        //这是按照年龄来排序的
        public int compareTo(Object obj)//比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
        {
         if(!(obj instanceof Student))
                 throw new RuntimeException("此对象不是学生");
         Student stu=(Student)obj;
         if(this.age>stu.age)
                 return 1;
         if(this.age==stu.age)//如果年龄相同则比较姓名
                {
                 return this.name.compareTo(stu.name);
                }
      return -1;
        }
        public String getName()
        {
        return name;
        }
        public int getAge()
        {
        return age;
        }

}
//自定义一个比较器按姓名来排序
class Mycompart implements Comparator
{
        public int compare(Object obj1, Object obj2)
        {
                Student s1=(Student)obj1;
                Student s2=(Student)obj2;               

         int num=s1.getName().compareTo(s2.getName());
         if(num==0)
                {
              return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
            }
         return num;

        }
}
class Treesetdemo2
{
        public static void sop(Object obj)
        {
        System.out.println(obj);
        }
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet(new Mycompart());
                ts.add(new Student("wwu1",34));
                ts.add(new Student("wwu2",264));
                ts.add(new Student("wwu2",24));
                ts.add(new Student("wwurtr3",54));
                ts.add(new Student("wwu3",5564));
                ts.add(new Student("wwu3",54));
                ts.add(new Student("wwu3",57674));
                ts.add(new Student("wwu4",38));
                for (Iterator it=ts.iterator();it.hasNext() ; )
                {
                        Object obj=it.next();
                        Student stu=(Student)obj;

                       
                        sop(stu.getName()+"---"+stu.getAge());
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
简单的说,实现了Comparable的类可以实现一种比较方式,如果要想要该类实现其他比较方法,就智能修改代码,这种方式不可取。
所以就有了Comparator,比较器,实现Comparator,在创建TreeSet的时候,传入不同的比较器,可实现不同的比较方法。

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

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)   
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
回复 使用道具 举报
李靖 中级黑马 2012-10-29 18:50:07
7#
comparable 是集合外部排序,是根据trreSet集合中对象的进行排序的,comparator是集合内部排序,是TreeSet t =new TreeSet(new Comparator(){
})而comparable是通过class Person implement comparable{
@Override
        public int compareTo(Object o)
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马