CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

comparable和Comparator区别,怎么用?望高手指教.

楼主lyf040230427(枫叶)2006-03-16 22:47:33 在 Java / J2SE / 基础类 提问

import   java.util.*;  
  class   Example  
  {  
  public   static   void   main(String   args[])  
  {  
  TreeSet<Student>   mytree=  
                              new   TreeSet<Student>(new   Comparator<Student>()  
  {  
  public   int   compare(Student   a,student   b)  
  {  
  return   a.compareTo(b);  
  }  
  });  
  Student   st1,st2,st3,st4;  
  st1=new   Student(90,"zhan   ying");  
  st2=new   Student(66,"wang   heng");  
  st3=new   Student(86,"zan   ying");  
  st4=new   Student(76,"hang   heng");  
  mytree.add(st1);  
  mytree.add(st2);  
  mytree.add(st3);  
  mytree.add(st4);  
  Iterator<Student>   te=mytree.iterator();  
  while(te.hasNext())  
  {  
  Student   stu=te.next();  
  System.out.println(""+stu.name+""+stu.english);  
  }  
  }  
  }  
  class   Student   implements   Comparable  
  {  
  int   english   =0;  
  String   name;  
  Student(int   e,String   n)  
  {  
  english=e;name=n;  
  }  
  public   int   compareTo(Object   b)  
  {  
  Student   st=(Student)b;  
  return(this.english-st.english);  
  }  
  }  
   
  都用到了.他们到底是怎么用的?谢谢了.  
  问题点数:20、回复次数:8Top

1 楼Nowish(看我能忍耐多久)回复于 2006-03-17 08:06:30 得分 0

Mark~Top

2 楼dlxu(脱离纯粹Coding阶段)回复于 2006-03-17 09:01:46 得分 1

Collection   Framework后台使用的,你只要负责实现这两个接口就行了Top

3 楼ChDw(米)回复于 2006-03-17 09:25:55 得分 3

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String   Integer自己就可以完成比较大小操作)  
   
  而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。  
   
   
  可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。Top

4 楼treeroot(旗鲁特)回复于 2006-03-17 09:30:24 得分 2

方法和函数的区别:  
  方法有一个this指针指向自己  
  函数没有this指针,需要两个参数Top

5 楼Nowish(看我能忍耐多久)回复于 2006-03-17 23:45:37 得分 0

Mark2~Top

6 楼Dan1980()回复于 2006-03-18 01:58:26 得分 10

用Comparator是策略模式(strategy   design   pattern),就是不改变对象自身,而用一个策略对象(strategy   object)来改变它的行为。  
   
  比如:你想对整数采用绝对大小来排序,Integer是不符合要求的,你不需要去修改Integer类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了Comparator接口的对象来实现控制它的排序就行了。  
   
  //AbsComparator.java  
  import   java.util.*;  
  public   class   AbsComparator   implements   Comparator   {  
      public   int   compare(Object   o1,   Object   o2)   {  
          int   v1   =   Math.abs(((Integer)o1).intValue());  
          int   v2   =   Math.abs(((Integer)o2).intValue());  
          return   v1   >   v2   ?   1   :   (v1   ==   v2   ?   0   :   -1);  
      }  
  }  
   
  可以用下面这个类测试AbsComparator:  
   
  //Test.java  
  import   java.util.*;  
   
  public   class   Test   {  
      public   static   void   main(String[]   args)   {  
   
          //产生一个20个随机整数的数组(有正有负)  
          Random   rnd   =   new   Random();  
          Integer[]   integers   =   new   Integer[20];  
          for(int   i   =   0;   i   <   integers.length;   i++)  
          integers[i]   =   new   Integer(rnd.nextInt(100)   *   (rnd.nextBoolean()   ?   1   :   -1));  
   
          System.out.println("用Integer内置方法排序:");  
          Arrays.sort(integers);  
          System.out.println(Arrays.asList(integers));  
   
          System.out.println("用AbsComparator排序:");  
          Arrays.sort(integers,   new   AbsComparator());  
          System.out.println(Arrays.asList(integers));  
      }  
  }  
   
  Top

7 楼Dan1980()回复于 2006-03-18 02:00:15 得分 4

不好意思,上面漏了一个字,是“对整数采用绝对值大小来排序”。Top

8 楼lyf040230427(枫叶)回复于 2006-03-20 17:05:55 得分 0

大概明白了,谢谢各位了。Top

相关问题

  • sql anywhere 怎么区别大小写
  • RECT CRect和CPoint怎么用?区别是什么?怎么转换?
  • 怎么理解(LPCSTR)"teststring"和"teststring"的区别,送分了
  • 堆和栈的区别和关系是怎么样的?
  • system.draw.Rectangle和system.draw.RectangleF,有什么区别,怎么转换?
  • MessageBox 和 TApplication.MessageBox怎么回事?有什么区别?
  • string 和 tstring有什么区别,怎么相互转换?
  • string 和 tstring有什么区别,怎么相互转换?
  • CString和CHString有什么区别CHString怎么用
  • c++和c#中的switch的区别怎么解决

关键词

  • 函数
  • 排序
  • 接口
  • compare
  • mytree
  • student
  • abscomparator
  • 对象
  • st
  • 比较

得分解答快速导航

  • 帖主:lyf040230427
  • dlxu
  • ChDw
  • treeroot
  • Dan1980
  • Dan1980

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo