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

© zhouxp3323 黑马帝   /  2012-3-21 20:15  /  2071 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Comparable与Comparator什么时候用哪个比较合适呢

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

3 个回复

倒序浏览
1、Comparable<T>是一个接口里面只有一个方法comparaTo()比较此对象与指定对象的顺序。
       如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
       做题的一般过程是,把创建对象赋的值放在ArrayList里面。再通过Collections类的sort()方法
       排序;然后输出就可以了。(普通类要实现Comparable<T>借口里面的comparaTo()方法,不然的话)不能
       用Collections类的sort()方法。
    2、Comparator<T>是一个接口里面有两个方法public int compare(Object arg0, Object arg1)和boolean equals(Object obj)继承 Comparator必须实现compare方法,用compareTo比较属性值,把对象的值保存在ArrayList中;同时用 Collections.sort(List<T> list,Comparator<? super T> c)去比较。最后输出即可。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
这是TreeSet的两种排序方式,所以如果定义的集合是TreeSet的 ,要对将要存入的元素排序时,可以用这两种方法;
Comparable是Java.lang包中的借口,可以通过元素实现接口的方式使元素自身具备比较性,必须在子类中复写compareTo方法;
Comparator是Java.Util包中的接口,让集合具备比较性,实现compartor接口,覆盖compare方法,实现一个比较器,在创建集合时将比较器传入:
TreeSet ts = new TreeSet(new cmp());
应为TreeSet底层是TreeMap实现的,所以想要比较TreeMap也可以使用这两种方法

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
1. 使用Comparable排序
  1. import java.util.*;
  2. public class ComparableTest{
  3.         public static void main(String[] args ){
  4.                 ArrayList<DVDInfo> dvdList = new ArrayList<DVDInfo>();
  5.                 populateList(dvdList);   // adds the file data to the ArrayList
  6.                 System.out.println("Before Sorting:");
  7.                 System.out.println(dvdList);
  8.                
  9.                 Collections.sort(dvdList);
  10.                 System.out.println("After Sorting:");
  11.                 System.out.println(dvdList);
  12.         }
  13.        
  14.         class DVDInfo implements Comparable<DVDInfo> {
  15.           String title;
  16.           String genre;
  17.           String leadActor;
  18.           DVDInfo(String t, String g, String a) {
  19.                 title = t;  genre = g;  leadActor = a;
  20.           }
  21.           public String toString() {
  22.                 return title + " " + genre + " " + leadActor + "/n";
  23.           }
  24.           public int compareTo(DVDInfo d) {   
  25.                 return title.compareTo(d.getTitle());  
  26.           }
  27.           public String getTitle() {
  28.                 return title;
  29.           }
  30.           // other getters and setters
  31.         }
  32.        
  33.         public static void populateList(ArrayList<DVDInfo> dvdList){
  34.             //Call inner class from a static context. use new OuterClass.new InnerClass()
  35.                 DVDInfo di1 = new ComparableTest().new DVDInfo("Matrix", "Science Fiction", "Keanu Reeves");
  36.                 DVDInfo di2 = new ComparableTest().new DVDInfo("Forrest Gump", "Comedy-drama", "Tom Hanks");
  37.                 DVDInfo di3 = new ComparableTest().new DVDInfo("Mission Impossible", "Action", "Tom Cruise");
  38.                 dvdList.add(di1);
  39.                 dvdList.add(di2);
  40.                 dvdList.add(di3);
  41.         }
  42. }

  43. /*
  44. Result:
  45. Before Sorting:
  46. [Matrix Science Fiction Keanu Reeves
  47. , Forrest Gump Comedy-drama Tom Hanks
  48. , Mission Impossible Action Tom Cruise
  49. ]
  50. After Sorting:
  51. [Forrest Gump Comedy-drama Tom Hanks
  52. , Matrix Science Fiction Keanu Reeves
  53. , Mission Impossible Action Tom Cruise
  54. ]

  55. */
复制代码
2. 使用Comparator排序
  1. import java.util.*;
  2. public class ComparatorTest{
  3.         public static void main(String[] args ){
  4.                 ArrayList<DVDInfo> dvdList = new ArrayList<DVDInfo>();
  5.                 populateList(dvdList);   // adds the file data to the ArrayList
  6.                 System.out.println("Before Sorting:");
  7.                 System.out.println(dvdList);
  8.                
  9.                 TitleComparator tc = new ComparatorTest().new TitleComparator();
  10.                 Collections.sort(dvdList, tc);
  11.                 System.out.println("After Sorting:");
  12.                 System.out.println(dvdList);
  13.         }
  14.        
  15.         class TitleComparator implements Comparator<DVDInfo>{
  16.                 public int compare(DVDInfo one, DVDInfo two){
  17.                         return one.getTitle().compareTo(two.getTitle());
  18.                 }
  19.         }
  20.        
  21.         //No need to implement Comparable
  22.         class DVDInfo {
  23.           String title;
  24.           String genre;
  25.           String leadActor;
  26.           DVDInfo(String t, String g, String a) {
  27.                 title = t;  genre = g;  leadActor = a;
  28.           }
  29.           public String toString() {
  30.                 return title + " " + genre + " " + leadActor + "/n";
  31.           }
  32.        
  33.           public String getTitle() {
  34.                 return title;
  35.           }
  36.           // other getters and setters
  37.         }
  38.        
  39.         public static void populateList(ArrayList<DVDInfo> dvdList){
  40.             //Call inner class from a static context. use new OuterClass.new InnerClass()
  41.                 DVDInfo di1 = new ComparatorTest().new DVDInfo("Matrix", "Science Fiction", "Keanu Reeves");
  42.                 DVDInfo di2 = new ComparatorTest().new DVDInfo("Forrest Gump", "Comedy-drama", "Tom Hanks");
  43.                 DVDInfo di3 = new ComparatorTest().new DVDInfo("Mission Impossible", "Action", "Tom Cruise");
  44.                 dvdList.add(di1);
  45.                 dvdList.add(di2);
  46.                 dvdList.add(di3);
  47.         }
  48. }

  49. /*
  50. Result:
  51. Before Sorting:
  52. [Matrix Science Fiction Keanu Reeves
  53. , Forrest Gump Comedy-drama Tom Hanks
  54. , Mission Impossible Action Tom Cruise
  55. ]
  56. After Sorting:
  57. [Forrest Gump Comedy-drama Tom Hanks
  58. , Matrix Science Fiction Keanu Reeves
  59. , Mission Impossible Action Tom Cruise
  60. ]

  61. */
复制代码
出处:http://blog.csdn.net/tohmin/article/details/6142611

QQ截图20120321204741.bmp (571.46 KB, 下载次数: 13)

QQ截图20120321204741.bmp

评分

参与人数 1技术分 +2 收起 理由
房宝彬 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马