黑马程序员技术交流社区
标题: Comparator 和 Comparable 的区别是什么? [打印本页]
作者: 黄佳 时间: 2012-10-12 15:50
标题: Comparator 和 Comparable 的区别是什么?
本帖最后由 黄佳 于 2012-10-12 19:05 编辑
Comparator 和 Comparable 的区别是什么?
作者: 王中利 时间: 2012-10-12 15:56
Comparetor 返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null.
Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
作者: 张忠豹 时间: 2012-10-12 18:57
|----TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树
保证元素唯一性的依据:compareTo方法return 0.
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序,或者叫默认排序。
TreeSet排序的第二种方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让容器自身(集合)具备比较性。自定义比较器(定义一个类实现Comparator接口,覆盖compare方法),将之作为参数传递给TreeSet的构造方法,这样在TreeSet集合初始化时,就有了比较方式。
当两种排序都存在时,以比较器为主。
作者: 曾浩 时间: 2012-10-12 19:16
1.继承这两个接口后所实现的方法不一样
2Comparable强行对实现它的每个类的对象进行整体排序----自然排序 他是让存入集合的元素自身一一定的比较性 我们只要实现这个接口后重写相关的方法即可 集合底层会自动帮我们调用。
3.而当元素自身没有可比性或者 元素的比较性不是我们想要的这时我们可以使用Comparator接口 并且要将接口的子类对象传到集合中 Comparator是让集合有可比性
作者: 草上飞 时间: 2012-10-28 18:00
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());
}
}
}
作者: 崔政 时间: 2012-10-29 12:41
简单的说,实现了Comparable的类可以实现一种比较方式,如果要想要该类实现其他比较方法,就智能修改代码,这种方式不可取。
所以就有了Comparator,比较器,实现Comparator,在创建TreeSet的时候,传入不同的比较器,可实现不同的比较方法。
comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
作者: 李靖 时间: 2012-10-29 18:50
comparable 是集合外部排序,是根据trreSet集合中对象的进行排序的,comparator是集合内部排序,是TreeSet t =new TreeSet(new Comparator(){
})而comparable是通过class Person implement comparable{
@Override
public int compareTo(Object o)
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |