使用背景:

Java中的对象,正常情况下,只能进行比较:== 或 != 。
当我们需要对多个对象进行排序或者比较时,应该如何实现——使用两个接口中的任何一个:Comparable 或 Comparator

实现Comparable接口

  • 当实现了Comparable接口后,就可以实现自然排序
  • 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
    1. 如果当前对象this大于形参对象obj,则返回正整数,
    2. 如果当前对象this小于形参对象obj,则返回负整数,
    3. 如果当前对象this等于形参对象obj,则返回零。
  • 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序

代码举例:

  1. public class Goods implements Comparable{
  2. private String name;
  3. private double price;
  4. //指明商品比较大小的方式:照价格从低到高排序,再照产品名称从高到低排序
  5. @Override
  6. public int compareTo(Object o) {
  7. // System.out.println("**************");
  8. if(o instanceof Goods){
  9. Goods goods = (Goods)o;
  10. //方式一:
  11. if(this.price > goods.price){
  12. return 1;
  13. }else if(this.price < goods.price){
  14. return -1;
  15. }else{
  16. // return 0;
  17. return -this.name.compareTo(goods.name);
  18. }
  19. //方式二:
  20. // return Double.compare(this.price,goods.price);
  21. }
  22. // return 0;
  23. throw new RuntimeException("传入的数据类型不一致!");
  24. }
  25. // getter、setter、toString()、构造器:省略
  26. }

实现Comparator接口

当元素的类型没实现java.lang.Comparable接口而又不方便修改代码,或者不满足java.lang.Comparable接口的自然排序规则,那么可以考虑使用 Comparator 的对象来排序
(定制排序)

代码举例:

  1. 1.实例化一个Comparator 对象
  2. Comparator com = new Comparator() {
  3. //指明商品比较大小的方式:照产品名称从低到高排序,再照价格从高到低排序
  4. @Override
  5. public int compare(Object o1, Object o2) {
  6. if(o1 instanceof Goods && o2 instanceof Goods){
  7. Goods g1 = (Goods)o1;
  8. Goods g2 = (Goods)o2;
  9. if(g1.getName().equals(g2.getName())){
  10. return -Double.compare(g1.getPrice(),g2.getPrice());
  11. }else{
  12. return g1.getName().compareTo(g2.getName());
  13. }
  14. }
  15. throw new RuntimeException("输入的数据类型不一致");
  16. }
  17. }
  18. 2.使用:
  19. Arrays.sort(goods,com);
  20. Collections.sort(coll,com);

两种排序方式对比

  • Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
    * Comparator接口属于临时性的比较。