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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雷云红 初级黑马   /  2012-6-12 17:50  /  2263 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Comparator与Comparable有什么区别呀?怎么用呀?高手用代码解决

7 个回复

倒序浏览
comparable和Comparator  都可以用来实现排序:
Comparable是在集合内部定义的方法实现的排序,需在集合内实现Comparable接口的方法compareTo();
Comparator是在集合外部实现的排序,需要在集合外定义Comparator接口的方法compare();
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作);   
Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
回复 使用道具 举报
下面两篇代码是分别用两个接口来实现了同样的目的

目的是:在TreeSet中加入对象元素,并对其中元素进行排序,假如出现学号相同则按名字字母的先后排序。
  1. import   java.util.Iterator;
  2. import   java.util.TreeSet;
  3. class   TreeSetTest
  4. {
  5. public   static   void   main(String[]   args)
  6. {
  7. TreeSet <Object>   ts=new   TreeSet <Object> ();

  8. ts.add(new   MyStudents(2, "Vida "));
  9. ts.add(new   MyStudents(4, "Lillian "));
  10. ts.add(new   MyStudents(2, "Lightmoon "));
  11. ts.add(new   MyStudents(1, "Chaner "));

  12. Iterator   it=ts.iterator();
  13. while(it.hasNext())
  14. {
  15. System.out.println(it.next());
  16. }

  17. }

  18. }

  19. class   MyStudents   implements   Comparable <Object>
  20. {
  21. int   number;
  22. String   name;
  23. MyStudents(int   number,String   name)
  24. {
  25. this.number=number;
  26. this.name=name;
  27. }
  28. public   String   toString()
  29. {
  30. return   "The   Student 's   information   is:   Number= "+number+ "   name= "+name;
  31. }
  32. public   int   compareTo(Object   o)
  33. {
  34. MyStudents   mst=(MyStudents)o;
  35. int   result;
  36. result=number   >   mst.number   ?   1   :   (number==mst.number   ?   0   :   -1);
  37. if(result==0)
  38. {
  39. return   result=name.compareTo(mst.name);
  40. }
  41. return   result;
  42. }
  43. }
复制代码
  1. import   java.util.*;
  2. class   TreeSetTest_1
  3. {
  4. public   static   void   main(String[]   args)
  5. {
  6. TreeSet <Object>   ts=new   TreeSet <Object> (new   MyStudents.MyStudentsComparator());

  7. ts.add(new   MyStudents(2, "Vida "));
  8. ts.add(new   MyStudents(4, "Lillian "));
  9. ts.add(new   MyStudents(2, "Lightmoon "));
  10. ts.add(new   MyStudents(1, "Chaner "));

  11. Iterator   it=ts.iterator();
  12. while(it.hasNext())
  13. {
  14. System.out.println(it.next());
  15. }

  16. }

  17. }

  18. class   MyStudents
  19. {
  20. int   number;
  21. String   name;
  22. MyStudents(int   number,String   name)
  23. {
  24. this.number=number;
  25. this.name=name;
  26. }
  27. public   String   toString()
  28. {
  29. return   "The   Student 's   information   is:   Number= "+number+ "   name= "+name;
  30. }

  31. static   class   MyStudentsComparator   implements   Comparator <Object>
  32. {
  33. public   int   compare(Object   o1,Object   o2)
  34. {
  35. MyStudents   mst1=(MyStudents)o1;
  36. MyStudents   mst2=(MyStudents)o2;
  37. int   result=mst1.number> mst2.number?1:(mst1.number==mst2.number?0:-1);
  38. if(result==0)
  39. {
  40. return   mst1.name.compareTo(mst2.name);
  41. }
  42. return   result;
  43. }

  44. }

  45. }
复制代码
一个是lang包下面的接口,一个是util包下面的接口,看起来两个是实现相同的目的,但两者还是有区别的,
1.Comparable <T> 只有一个要实现的方法叫CompareTo
而Comparator <T> 取有两个方法.一个是Compare和equals
2Comparable是一个参数的.而且他是系统调用的方法.所以他只能表示传入对象与当前对象的比较
而Comparator是两个参数的,虽然也是系统调用的方法,不过他的比较就可以不是当前对象于传入对象的比较了,范围就大多了.

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
Java代码
  • /**
  • * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
  • */  
  • int compare(Object o1, Object o2);  

  /**   * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。   */  int compare(Object o1, Object o2);案例:Java代码
  • import java.util.Arrays;  
  • import java.util.Comparator;  
  •   
  • public class SampleComparator implements Comparator {  
  •   
  •   public int compare(Object o1, Object o2) {  
  •     return toInt(o1) - toInt(o2);  
  •   }  
  •   
  •   private int toInt(Object o) {  
  •     String str = (String) o;  
  •     str = str.replaceAll("一", "1");  
  •     str = str.replaceAll("二", "2");  
  •     str = str.replaceAll("三", "3");  
  •     //   
  •     return Integer.parseInt(str);  
  •   }  
  •   
  •   /**
  •    * 测试方法
  •    */  
  •   public static void main(String[] args) {  
  •     String[] array = new String[] { "一二", "三", "二" };  
  •     Arrays.sort(array, new SampleComparator());  
  •     for (int i = 0; i < array.length; i++) {  
  •       System.out.println(array);  
  •     }  
  •   }  
  •   
  • }  

import java.util.Arrays;import java.util.Comparator;public class SampleComparator implements Comparator {  public int compare(Object o1, Object o2) {    return toInt(o1) - toInt(o2);  }  private int toInt(Object o) {    String str = (String) o;    str = str.replaceAll("一", "1");    str = str.replaceAll("二", "2");    str = str.replaceAll("三", "3");    //     return Integer.parseInt(str);  }  /**   * 测试方法   */  public static void main(String[] args) {    String[] array = new String[] { "一二", "三", "二" };    Arrays.sort(array, new SampleComparator());    for (int i = 0; i < array.length; i++) {      System.out.println(array);    }  }}二、Comparable
强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
接口方法:
Java代码
  • /**
  • * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。  
  • */  
  • int compareTo(Object o);  

  /**   * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。    */  int compareTo(Object o);
假设对象User,需要按年龄排序:
Java代码
  • public class User {  
  •   
  •   private String id;  
  •   private int age;  
  •   
  •   public User(String id, int age) {  
  •     this.id = id;  
  •     this.age = age;  
  •   }  
  •   
  •   public int getAge() {  
  •     return age;  
  •   }  
  •   
  •   public void setAge(int age) {  
  •     this.age = age;  
  •   }  
  •   
  •   public String getId() {  
  •     return id;  
  •   }  
  •   
  •   public void setId(String id) {  
  •     this.id = id;  
  •   }  
  •   
  • }  

public class User {  private String id;  private int age;  public User(String id, int age) {    this.id = id;    this.age = age;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }}改造后的对象:
Java代码
  • import java.util.Arrays;  
  •   
  • public class User implements Comparable {  
  •   
  •   private String id;  
  •   private int age;  
  •   
  •   public User(String id, int age) {  
  •     this.id = id;  
  •     this.age = age;  
  •   }  
  •   
  •   public int getAge() {  
  •     return age;  
  •   }  
  •   
  •   public void setAge(int age) {  
  •     this.age = age;  
  •   }  
  •   
  •   public String getId() {  
  •     return id;  
  •   }  
  •   
  •   public void setId(String id) {  
  •     this.id = id;  
  •   
  •   }  
  •   
  •   public int compareTo(Object o) {  
  •     return this.age - ((User) o).getAge();  
  •   }  
  •   
  •   /**
  •    * 测试方法
  •    */  
  •   public static void main(String[] args) {  
  •     User[] users = new User[] { new User("a", 30), new User("b", 20) };  
  •     Arrays.sort(users);  
  •     for (int i = 0; i < users.length; i++) {  
  •       User user = users;  
  •       System.out.println(user.getId() + " " + user.getAge());  
  •     }  
  •   }  
  •   
  • }  

import java.util.Arrays;public class User implements Comparable {  private String id;  private int age;  public User(String id, int age) {    this.id = id;    this.age = age;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }  public int compareTo(Object o) {    return this.age - ((User) o).getAge();  }  /**   * 测试方法   */  public static void main(String[] args) {    User[] users = new User[] { new User("a", 30), new User("b", 20) };    Arrays.sort(users);    for (int i = 0; i < users.length; i++) {      User user = users;      System.out.println(user.getId() + " " + user.getAge());    }  }}三、Comparator和Comparable的区别
先看一下使用Comparator对User集合实现排序的方式:
Java代码
  • import java.util.Arrays;  
  • import java.util.Comparator;  
  •   
  • public class UserComparator implements Comparator {  
  •   
  •   public int compare(Object o1, Object o2) {  
  •     return ((User) o1).getAge() - ((User) o2).getAge();  
  •   }  
  •   
  •   /**
  •    * 测试方法
  •    */  
  •   public static void main(String[] args) {  
  •     User[] users = new User[] { new User("a", 30), new User("b", 20) };  
  •     Arrays.sort(users, new UserComparator());  
  •     for (int i = 0; i < users.length; i++) {  
  •       User user = users;  
  •       System.out.println(user.getId() + " " + user.getAge());  
  •     }  
  •   }  
  •   
  • }  

import java.util.Arrays;import java.util.Comparator;public class UserComparator implements Comparator {  public int compare(Object o1, Object o2) {    return ((User) o1).getAge() - ((User) o2).getAge();  }  /**   * 测试方法   */  public static void main(String[] args) {    User[] users = new User[] { new User("a", 30), new User("b", 20) };    Arrays.sort(users, new UserComparator());    for (int i = 0; i < users.length; i++) {      User user = users;      System.out.println(user.getId() + " " + user.getAge());    }  }}
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
回复 使用道具 举报
本帖最后由 邱俊杰 于 2012-6-12 18:05 编辑

Comparable  应该是集合自身就具备比较性,但是比较方式不是你想要的,这时候你就可以实现 Comparable,复写CompareTo方法,定义自己的比较方式,比如TreeSet集合是实现自然排序的。如果你不想自然排序就实现Comparable接口。

Comparator 集合存入的数据本身不具备比较性, Comparator能强制实现比较。只要在集合声明比较器就可以了, 个人理解、
回复 使用道具 举报
这个问题百度可以解决
回复 使用道具 举报
当元素自身具备比较性时。元素可以实现comparable接口,重写compareTo方法。这种方式就是元素的自然顺序,或者叫默认数序。
当元素自身不具备比较性,或具备的比较性不是所需要的,这时就需要集合自身具备比较性,在集合初始化时就有了比较性。
即定义一个比较器: 实现comparator接口,重写compare方法
如果同时存在comparable和comparator  以比较器为主
回复 使用道具 举报
本帖最后由 逝去的记忆ヽ 于 2012-6-12 18:08 编辑

Comparator:强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

Comparable:强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。


一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等

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