黑马程序员技术交流社区
标题:
Comparator和Comparable的区别
[打印本页]
作者:
刘佳
时间:
2012-9-4 16:52
标题:
Comparator和Comparable的区别
本帖最后由 刘佳 于 2012-9-5 19:34 编辑
什么时候使用接口Comparable,什么时候使用Comparator接口,两者之间有何区别?
作者:
周兴华
时间:
2012-9-4 16:59
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()); //此时的排序方式为第二种,即集合自身具备比较性。
作者:
杨习平
时间:
2012-9-4 17:16
在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());
}
}
}
作者:
广驰
时间:
2012-9-4 17:18
Comparable是放入框架的类先要具备比较性要继承的,不然就无法排序,因为框架是调用该类的compareTo方法来比较的,这样的话,一个类只有一种比较的方法
而 Comparator是框架自己的比较器,通过定义类实现该接口来定义比较器,这时一个单独的比较器,可以通过这样的方法定义很多比较器,只要符合规则都可以通过相应比较器来比较排序。这样就比较灵活
作者:
孙鑫
时间:
2012-9-4 17:27
Comparator 和 Comparable 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序。
所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)。
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2