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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宗士为 中级黑马   /  2012-5-12 19:54  /  1730 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

Comparable与Comparator的区别是什么呢,
什么时候用Comparable,什么时候用Comparator
现在只记住了怎么用但是不知道为什么

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String   Integer自己就可以完成比较大小操作)。
Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
换一句话说可以说一个是自已完成比较,一个是外部程序实现比较。
回复 使用道具 举报
comparable和Comparator都是用来实现集合中的排序的,
1,让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法;
2,当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
定义一个类,实现Comparator接口,覆盖compare方法。
回复 使用道具 举报
这是TreeSet的两种排序方式,所以如果定义的集合是TreeSet的 ,要对将要存入的元素排序时,可以用这两种方法;
Comparable是Java.lang包中的借口,可以通过元素实现接口的方式使元素自身具备比较性,必须在子类中复写compareTo方法;
Comparator是Java.Util包中的接口,让集合具备比较性,实现compartor接口,覆盖compare方法,实现一个比较器,在创建集合时将比较器传入:
TreeSet ts = new TreeSet(new cmp());
应为TreeSet底层是TreeMap实现的,所以想要比较TreeMap也可以使用这两种方法

1. 使用Comparable排序
01.import java.util.*;

02.public class ComparableTest{

03.        public static void main(String[] args ){

04.                ArrayList<DVDInfo> dvdList = new ArrayList<DVDInfo>();

05.                populateList(dvdList);   // adds the file data to the ArrayList

06.                System.out.println("Before Sorting:");

07.                System.out.println(dvdList);

08.               

09.                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./*

45.Result:

46.Before Sorting:

47.[Matrix Science Fiction Keanu Reeves

48., Forrest Gump Comedy-drama Tom Hanks

49., Mission Impossible Action Tom Cruise

50.]

51.After Sorting:

52.[Forrest Gump Comedy-drama Tom Hanks

53., Matrix Science Fiction Keanu Reeves

54., Mission Impossible Action Tom Cruise

55.]

2. 使用Comparator排序
01.import java.util.*;

02.public class ComparatorTest{

03.        public static void main(String[] args ){

04.                ArrayList<DVDInfo> dvdList = new ArrayList<DVDInfo>();

05.                populateList(dvdList);   // adds the file data to the ArrayList

06.                System.out.println("Before Sorting:");

07.                System.out.println(dvdList);

08.               

09.                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./*

51.Result:

52.Before Sorting:

53.[Matrix Science Fiction Keanu Reeves

54., Forrest Gump Comedy-drama Tom Hanks

55., Mission Impossible Action Tom Cruise

56.]

57.After Sorting:

58.[Forrest Gump Comedy-drama Tom Hanks

59., Matrix Science Fiction Keanu Reeves

60., Mission Impossible Action Tom Cruise

61.]

62.

63.*/

204901qufch9jrq6ewqbhe.jpg (571.46 KB, 下载次数: 17)

204901qufch9jrq6ewqbhe.jpg

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张晨 于 2012-5-12 20:43 编辑

comparalbe接口用于是已有类具有比较性,必须重写compareTo(T o) 方法。
  1. package TestComparator;

  2. public class Person implements Comparable<Person>{
  3.         private int age;
  4.         private String name;

  5.         public Person(int age, String name) {
  6.                 super();
  7.                 this.age = age;
  8.                 this.name = name;
  9.         }

  10.         public int getAge() {
  11.                 return age;
  12.         }

  13.         public void setAge(int age) {
  14.                 this.age = age;
  15.         }

  16.         public String getName() {
  17.                 return name;
  18.         }

  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }

  22.         @Override
  23.         public int compareTo(Person p2) {  //这里可以使此类本身具有比较性
  24.                 if(this.getAge() == p2.getAge())
  25.                 {
  26.                         return this.getName().compareTo(p2.getName());
  27.                 }
  28.                 return this.getAge()-p2.getAge();
  29.         }

  30.         

  31. }
复制代码
  1. package TestComparator;

  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. public class TestDemo {

  5.         public static void main(String[] argc) {
  6.                 TreeSet<Person> ts = new TreeSet<Person>();  //注意这里TreeSet()没有传比较器,由于类本身有比较性,所以可以添加元素
  7.                 ts.add(new Person(22,"p1"));
  8.                 ts.add(new Person(23,"p2"));
  9.                 ts.add(new Person(24,"p3"));
  10.                
  11.                 for (Iterator<Person> it = ts.iterator(); it.hasNext();)
  12.                 {
  13.                         Person person = it.next();
  14.                         System.out.println(person.getName()+":"+person.getAge());
  15.                 }
  16.                
  17.         }
  18. }
复制代码
comparator也是一个接口,用于使colletction具有比较性,重写compare方法,通用性比较强。
  1. package TestComparator;

  2. public class Person {  //此类本身是没有比较性的
  3.         private int age;
  4.         private String name;

  5.         public Person(int age, String name) {
  6.                 super();
  7.                 this.age = age;
  8.                 this.name = name;
  9.         }

  10.         public int getAge() {
  11.                 return age;
  12.         }

  13.         public void setAge(int age) {
  14.                 this.age = age;
  15.         }

  16.         public String getName() {
  17.                 return name;
  18.         }

  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }

  22. }
复制代码
  1. package TestComparator;

  2. import java.util.Comparator;

  3. public class Compar implements Comparator<Person> {  //独立的比较器,比较两个类的关系

  4.         @Override
  5.         public int compare(Person p1, Person p2) {
  6.                 if(p1.getAge() == p2.getAge())
  7.                 {
  8.                         return p1.getName().compareTo(p2.getName());
  9.                 }
  10.                 return p1.getAge()-p2.getAge();
  11.         }
  12.         
  13. }
复制代码
  1. package TestComparator;

  2. import java.util.Iterator;
  3. import java.util.TreeSet;

  4. public class TestDemo {

  5.         public static void main(String[] argc) {
  6.                 TreeSet<Person> ts = new TreeSet<Person>(new Compar());  //这里必须有比较器,否则会出错
  7.                 ts.add(new Person(22,"p1"));
  8.                 ts.add(new Person(23,"p2"));
  9.                 ts.add(new Person(24,"p3"));
  10.                
  11.                 for (Iterator<Person> it = ts.iterator(); it.hasNext();)
  12.                 {
  13.                         Person person = it.next();
  14.                         System.out.println(person.getName()+":"+person.getAge());
  15.                 }
  16.                
  17.         }
  18. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马