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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李靖 中级黑马   /  2012-10-26 20:57  /  1880 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bhxiaobo 于 2012-10-27 18:03 编辑

请问哪些结合用到了Comparable和Comparator接口,我只知道TreeSet排列二叉树是用到了,还有Comparable和Comparator各有啥优劣

评分

参与人数 1黑马币 +6 收起 理由
韩军博 + 6 神马都是浮云

查看全部评分

6 个回复

倒序浏览
也就TreeSet集合用这玩意用的多。
1、Comparable:使元素自身具备比较作用,所以在想TreeSet中添加元素的时候,一般都要实现Comparable这儿接口,重写compareTo方法。【自然排序】
2、如果,你认为这样做不方便,你也可以使容器具备比较性。
在new TreeSet(new Comparator(){实现代码});这个时候要重写compare()方法
当这两种方式都存在的时候,Comparator的优先级高于Comparable。

当然,在特殊的时候,你也可以用Collections中的reverseOrder() 来作为Comparator。

评分

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

查看全部评分

回复 使用道具 举报
Comparable是一个接口,一个实现这个接口之后,这个类就具备了比较性,比如一个Student对象,这个对象本身是没有比较性的,实现这个接口之后,覆盖compareTo方法,实现比较
而Comparator也是一个接口,可以自定义比较规则
至于说他们有啥优劣,我觉得这个没有,不同的情况用不同的方法,选择最适合的

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张忠豹 发表于 2012-10-26 21:19
也就TreeSet集合用这玩意用的多。
1、Comparable:使元素自身具备比较作用,所以在想TreeSet中添加元素的时 ...

那其他集合有用到的吗?其他集合涉及到排序吗?
回复 使用道具 举报
Comparable是在集合内部对象实现接口,对象自己本身就可以完成比较的。
Comparator是在集合外部实现的排序,根据比较器的具体比较方来实现排序。
从实际应用上,comparator偏向与不确定的比较。如果你事先不确定集合用什么排序方法,如何让对象自己完成比较呢?
而比较器的话,你可以在一个比较器预先定义几种比较方法(比如,先成绩、后名字或者先名字、后成绩)。
比较器可以在构函里面定义个排序变量 ,用这个变量来控制用什么比较方法。。。

评分

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

查看全部评分

回复 使用道具 举报
bhxiaobo 发表于 2012-10-26 21:32
那其他集合有用到的吗?其他集合涉及到排序吗?

目前为止,没发现它们作用在其它的集合中。
回复 使用道具 举报
崔政 中级黑马 2012-10-27 17:45:48
7#
既然看到了Comparable和Comparator了,那你应该也看过了多线程。
多线程的extends Thread 和 implements Runnable 和这个感觉有点类似的意思。
Comparable是让类实现该接口,具有比较性,但是,如果想用另一种比较方式,需要修改代码,这不合适。
所以就有了Comparator,实现Comparator接口,实现compare方法,定义自己的比较方法,如果需要用这种比较方式,就吧该类穿进去,让代码更加灵活
这也体现了接口的好处,扩展性更强
如下面代码:

  1. import java.util.*;
  2. class TreeSetDemo2{
  3.         public static void main(String[]args){
  4.                 TreeSet ts=new TreeSet(new MyCompare());
  5.                 ts.add(new Student("lisi02",22));
  6.                 ts.add(new Student("lisi07",20));
  7.                 ts.add(new Student("lisi09",19));
  8.                 ts.add(new Student("lisi01",40));
  9.                 for(Iterator<Student> iter=ts.iterator();iter.hasNext();){
  10.                         Student stu=(Student)iter.next();
  11.                         System.out.println(stu.getName()+"..."+stu.getAge());
  12.                 }
  13.         }
  14. }

  15. class Student implements Comparable{
  16.         private String name;
  17.         private int age;
  18.         
  19.         Student(String name, int age){
  20.                 this.name=name;
  21.                 this.age=age;
  22.         }
  23.         public String getName(){
  24.                 return name;
  25.         }
  26.         public int getAge(){
  27.                 return age;
  28.         }
  29.         @Override
  30.         public int compareTo(Object o) {
  31.                 if(!(o instanceof Student))
  32.                         throw new RuntimeException("传值类型不是学生");
  33.                 Student s=(Student)o;
  34.                 if(this.age>s.age){
  35.                         return 1;
  36.                 }
  37.                 if(this.age==s.age){
  38.                         return this.name.compareTo(s.name);
  39.                 }
  40.                 return -1;
  41.         }
  42. }

  43. class MyCompare implements Comparator{
  44.         public int compare(Object o1,Object o2){
  45.                 Student s1=(Student)o1;
  46.                 Student s2=(Student)o2;
  47.                 int result=s1.getName().compareTo(s2.getName());
  48.                 if(result==0){
  49.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  50.                 }
  51.                 return result;
  52.         }
  53. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马