一、比较器概述
前面讲的比较运算符都是针对基本数据类型。引用数据类型目前只有比较地址相等,或者不等。现在希望能够根据需求比较引用数据类型(比如天猫上购物,商品都是对象,按价格排序,按销量排序?),因此需要比较器(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);
}
}
}); //用匿名对象重写方法的规则,完成临时一次排序