一.Java比较器的概述
1.为什么要使用比较器?
当java涉及到数组排序时,就会使用到比较器
import java.util.Arrays;
public class ComparableTest1 {
public static void main(String[] args) {
String [] arr = {"AA","FF","SS","BB","DD","CC"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
2.实现排序的两种方式:
①自然排序:java.lang.Comparable
②定制排序: java.util.Comparator
3.说明:
java对象中,正常情况下只能进行 == 或 !=比较,不能使用 < 或 > 进行比较,但在实际中,需对多个对象排序,,言外之意就是比较大小,所以这时候就无法满足我们的要求
如何实现?
使用两个接口中的任意一个;
Comparable或Comparator
一.Conparable接口使用举例
1.像String,包装类等都实现了Comparable接口,重写了CompareTo(obj)方法,给出了比较两个对象大小的方式
2.重写CompareTo(obj)规则:
-
如果当前对象的this大于形参对象的obj,则返回正整数
-
如当前对象的的this小于形参对象的obj,则返回负整数
-
如果当前对象的this等于形参对象的obj,则返回0
3.对于自定义类,如果需要排序,可使自定义类实现Comparable接口,重写CompareTo
()方法,并指明需要如何排序
public int CompareTo(Object o){
if (o instanceof Goods){ //判断o是否是Goods的实例
Goods goods = (Goods)o;
if(((Goods) o).price>goods.price){
return 1;
} else if (((Goods) o).price<goods.price){
return -1;
} else if (((Goods) o).price==goods.price){
return 0;
}
throw new RuntimeException("输入类型不一致!");
}
}
二.Comparator定制排序方法
1.当元素类型没有实现java.lang.Comparable接口,而又不方便修改代码,或者实现了Comparable接口,但给定的排序规则不符合当前所需操作,这时我们就可以考虑实现Comparator接口,从而实现强制对多个对象进行排序操作
2.重写CompareTo(obj1 ,obj 2)方法,比较o1和o2,如果返回值时正数,则o1>o2;如果返回值为负数,则o1<o2;如果返回值为0,则o1==o2
3.可以将Comparator传递给sort()方法(如Collection.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制
4.Comparator实现的栗子:
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorTest {
public static void main(String[] args) {
String [] arr = new String[]{"AA","CC","GG","BB","DD"};
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1 instanceof String && o2 instanceof String){ //判断o1及o2是否为String类型
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2); //调用compareTo方法比较元素大小,添加负号表明为从大到小排序
}
throw new RuntimeException("输入不一致!");
}
});
System.out.println(Arrays.toString(arr));
}
}
三.两种实现方式的对比: