我将从背景和使用两个方面去讲述
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); } }
就是定义一套规则,将这个对象以参数的形式传递参数。