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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

comparator和comparable两个接口的区别

3 个回复

倒序浏览
这个问题不久前就有人提过了

Comparable:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法

如下面的代码:学生对象是不具备比较性的所以让他实现Comparable接口具备比较性

  1. <P>package doo;
  2. /*
  3. * |--TreeSet:可以对Set集合中的元素进行排序
  4. *
  5. * 需求:往集TreeSet合中存储自定义对象学生
  6. * 想按照学生的年龄进行排序
  7. *
  8. * 记住:排序时当主要条件相同时,一定要判断一下次要条件
  9. */
  10. import java.util.*;
  11. class Student implements Comparable{//强制让元素具备比较性
  12. private String name;
  13. private int age;
  14. Student(String name,int age){
  15. this.name=name;
  16. this.age=age;
  17. }
  18. //复写这个接口中的方法,并且让他具备想要的比较性</P>
  19. <P>public int compareTo(Object obj){
  20. if(!(obj instanceof Student))
  21. throw new RuntimeException("不是学生对象!");
  22. Student s=(Student)obj;
  23. System.out.println(this.name+"**Comparable**"+s.name);
  24. if(this.age>s.age)
  25. return 1;
  26. if(this.age==s.age){
  27. return this.name.compareTo(s.name);
  28. }


  29. return -1;
  30. }
  31. public String getName(){
  32. return name;
  33. }
  34. public int getAge(){
  35. return age;
  36. }
  37. }
  38. public class VectorDemo {

  39. public static void main(String[] args) {
  40. TreeSet ts=new TreeSet();
  41. //TreeSet会为元素进行排序,但是要求元素具备比较性
  42. //这里是对象没有比较性,所以要让他具备比较性
  43. ts.add(new Student("lisi04",24));
  44. ts.add(new Student("lisi01",20));
  45. ts.add(new Student("lisi03",22));
  46. ts.add(new Student("lisi02",21));
  47. ts.add(new Student("lisi05",24));

  48. Iterator it=ts.iterator();
  49. while(it.hasNext()){
  50. Student s=(Student)it.next();
  51. sop(s.getName()+"****"+s.getAge());

  52. }
  53. }

  54. public static void sop(Object obj){
  55. System.out.println(obj);
  56. }

  57. }</P>
复制代码

Comparator:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将类该对象作为实际参数传递给TreeSet集合的构造函数
如代码:
  1. package doo;
  2. /*
  3. * 练习:按照字符串长度排序
  4. * 字符串本身具备比较性,但是他的比较方式不是所需要的
  5. * 这时就能使用比较器
  6. */
  7. import java.util.*;
  8. public class VectorDemo {

  9. public static void main(String[] args) {
  10. TreeSet ts=new TreeSet(new StrLenCompare());//将类该对象作为实际参数传递给TreeSet集合的构造函数
  11. ts.add("abd");
  12. ts.add("ab");
  13. ts.add("aaa");
  14. ts.add("acdsd");
  15. ts.add("acvd");
  16. ts.add("a");
  17. Iterator it=ts.iterator();
  18. while(it.hasNext()){
  19. sop(it.next());
  20. }
  21. }

  22. public static void sop(Object obj){
  23. System.out.println(obj);
  24. }

  25. }
  26. class StrLenCompare implements Comparator{
  27. public int compare(Object o1,Object o2){
  28. String s1=(String)o1;
  29. String s2=(String)o2;
  30. // if(s1.length()>s2.length())
  31. // return 1;
  32. // if(s1.length()==s2.length())
  33. // return 0;
  34. int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
  35. if(num==0)
  36. return s1.compareTo(s2);
  37. return num;
  38. }

  39. }
复制代码

第二种方式较为灵活。而且当两种方式都存在时,以比较器为主




回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-6 16:12
这个问题不久前就有人提过了

Comparable:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖co ...

谢谢!!
回复 使用道具 举报

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