一、比较器概述

      前面讲的比较运算符都是针对基本数据类型。引用数据类型目前只有比较地址相等,或者不等。现在希望能够根据需求比较引用数据类型(比如天猫上购物,商品都是对象,按价格排序,按销量排序?),因此需要比较器(c++可通过运算符重载实现自定义比较)

         Java中的对象,正常情况下,只能进行比较地址:== 或 !=,不能使用>,<,但是开发场景中,我们需要对多个对象进行培训。言外之意,我们需要比较大小。

二、Java比较器

     在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。

     Java实现对象排序的方式有两种:使用两个接口中的任何一个。

自然排序:java.lang.Comparable   (接口)

定制排序:java.util.Comparator    (接口)

2.1 Comparable接口 (从写compareTo()方法)

    一劳永逸,写完以后,就可以在很多工具类里面一直用。相当于编写类的默认排序规则

回忆:String类,就实现了Comparable接口,因此可以随意排序

String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式(从小到大排列)。

1、JDK中的现有类重写compareTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数

如果当前对象this小于形参对象obj,则返回负整数

如果当前对象this等于形对象obj,则返回要。

2、对于自定义类来说,如果需要排序,我们需要让自定义类来实现Comparable接口。重写compareTo()方法,在方法中指明如何排序。

exp:

public class Goods{  //创建一个用来做排序实验的类 Goods
  private String name;
  private double price;
  public Goods(){  //空参构造器
  }
  public Goods(String name,double price){   //带参赋值构造器
    this.name = name;
    this.price = price;
  }
  public int compareTo(Object o){ //自己动手造轮子,写比较方法
      if(o instanceof Goods){  //判定是否是Goods对象,肯定是,只是为了严谨
          Goods goods = (Goods) o;  //将变量提升成子类,这样才能获得更多属性
          if(this.price>goods.price){
                return 1;
              }else if(this.price<goods.price){
                return -1;
              }else{
                return 0;
              }
          }
      }
}

说明: 提供有现成的轮子  Double类的compare()方法

exp
public int compareTo(Object o){ //自己动手造轮子,写比较方法
    if(o instanceof Goods){  //判定是否是Goods对象,肯定是,只是为了严谨
        Goods goods = (Goods) o;  //将变量提升成子类,这样才能获得更多属性
        return Double.compare(this.price,goods.jprice);  //直接使用Double类的compare方法完成比较
        }
    }
main(){
  Goods[ ] arr = new Goods[2];
   arr[0] = new Goods("iphone",5500);
   arr[1] = new Goods("HuaWei",8500);
    Arrays.sort(arr);   //自定义对象,实现了Comparable接口后,可用工具类 Arrays.sort()方法,进行排序
}

2.2定制排序:java.util.Comparator (接口)  重写compare

     临时使用的附加个性排序规则。默认排序规则不方便的时候使用

1、背景

    当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较。

说明:本来String类默认从大到小排序,临时需要从小到大排序,就可以使用这个实现java.util.Comparator接口的对象

2、重写compare方法 规则

    重写compare(Object o1,Object o2)方法

规则:比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;

           如果返回0,表示相等;

            返回负整数,表示o1小于o2.

    可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort)从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

exp:

main(){
    String[ ]  arr = new String[ ]{"AA","BB","MM"}; //静态初始化数组AA BB MM
    Arrays.sort(arr,new Comparator(){  //调用Arrays.sort的另一重载方法,(对象,排序规则)即Comparator()实现类
        public int compare(Object o1,Object o2){   //重写compare方法的匿名实现类(反正只用一次)
            if(o1 instancefo String && o2 instanceof String){ //提升变量成子类
                String s1=(String) o1;
                String s2=(String) o2;
                return -s1.compareTo(s2);
            }
        } 
     });  //用匿名对象重写方法的规则,完成临时一次排序