我将从背景和使用两个方面去讲述
1.Comparable(自然排序)
首先讲一下Comparable的作用,有时候,我们需要对对象进行排序,比如说对商城中所有的手机价格按高到低进行展示。
我们使用Arrays.sort(arr[])对字符串或者Integer进行排序没有做任何操作,这又是为什么呢?这是因为他们都实现了Comparable接口。
接下来如果我们实现了这样的接口,但是如何进行排序呢,或者说按照什么规则进行排序,我们需要在实现compareTo抽象方法,抽象方法代码实现如下:
@Override
public int compareTo(ComparableTest o) {
if(o==this){
return 0;
}
if(o instanceof ComparableTest){
ComparableTest pro = (ComparableTest) o;
int value= Double.compare(this.price,pro.price);
if(value!=0){
return value;
}
return this.name.compareTo(pro.name);
}
throw new RuntimeException("类型比较异常");
}
这里的返回类型是int,如果返回值大于0,那么当前对象大,如果返回值等于0,那么两个对象相等。如果返回值小于0,那么后面的对象大。基本的思路就是首先判断一下两个对象的地址是否相等,如果相等直接返回0。这一步我认为是减枝操作。接下来,判断一下是否是当前类型的对象,这里是Product,然后在这里面定义规则,比如说按照价格排序,或者如果价格相同,按照名称排序。如果不是product对象,则直接抛出异常。
2.Comparator(定制排序)
首先讲一下为什么会引入Comparator,这里有两种场景,可能需要使用Comparator.
1.有一些第三方类,无法进行修改源代码
2.实现了comparable接口,但是这种排序方式并不符合我们的需求,我们需要另外定义排序规则进行排序。
讲一下如何使用这个Comparator,下图为定制排序的代码:
public static void main(String[] args) {
ComparatorTest[] arr = new ComparatorTest[5];
arr[0] = new ComparatorTest("huawei",4776);
arr[1] = new ComparatorTest("xiaomi",4732);
arr[2] = new ComparatorTest("nuojiya",5435);
arr[3] = new ComparatorTest("appo",5435);
arr[4] = new ComparatorTest("vivo",4633);
Comparator<ComparatorTest> comparator = new Comparator<ComparatorTest>() {
@Override
public int compare(ComparatorTest o1, ComparatorTest o2) {
if((o1 instanceof ComparatorTest) && (o2 instanceof ComparatorTest) ){
ComparatorTest c1 = (ComparatorTest) o1;
ComparatorTest c2 = (ComparatorTest) o2;
return Double.compare(c1.price,c2.price);
}
throw new RuntimeException("类型比较异常");
}
};
Arrays.sort(arr, comparator);
for(ComparatorTest pro:arr){
System.out.println("pro.name = " + pro.name+"pro.price"+pro.price);
}
}
就是定义一套规则,将这个对象以参数的形式传递参数。
394





