1.自定义类
public class Goods implements Comparable{
String name;
Integer price;
public Goods(String name, Integer price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Goods{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
public int compareTo(Object o) {
if(o instanceof Goods) {
Goods goods = (Goods) o;
if(this.getPrice() > goods.getPrice()) {
return 1;
}else if(this.getPrice() < goods.getPrice()) {
return -1;
}else {
//return 0;
return this.getName().compareTo(goods.getName());
}
}
throw new RuntimeException("传参不一致!");
}
}
2.测试
1.自然排序
public static void main(String[] args) {
Goods[] arr = new Goods[4];
arr[0] = new Goods("xiaomi", 90);
arr[1] = new Goods("apple", 900);
arr[2] = new Goods("huawei", 400);
arr[3] = new Goods("oppo", 90);
Arrays.sort(arr);//自然排序
System.out.println("自然排序:" + Arrays.toString(arr));
}
输出:
说明:
自然排序需要自定义类去实现了Comparable接口中的compareTo方法。调用Arrays.sort进行排序时,该sort方法会默认去调用自定义类中的compareTo,根据compareTo方法中定义的规则(如:根据price进行降序或升序)进行排序。为了作区分,这里实现了按price升序。
2. 定制排序
public static void main(String[] args) {
Goods[] arr = new Goods[4];
arr[0] = new Goods("xiaomi", 90);
arr[1] = new Goods("apple", 900);
arr[2] = new Goods("huawei", 400);
arr[3] = new Goods("oppo", 90);
Arrays.sort(arr, (o1, o2) -> o2.getPrice() - o1.getPrice() );
System.out.println("定制排序:" + Arrays.toString(arr));
}
输出:
说明:
定制排序,需要在调用Arrays.sort方法时,需要在参数二的位置传入Comparator对象,实现Comparator中的compare方法,这里我们使用了Lambda表达式的写法来代替函数式接口Comparator。这种排序方式,相当于给Arrays.sort方法定制了一个临时的排序规则。
3.总结
个人认为:自然排序(Comparable)是针对于元素(类)的,即在待排序元素内部定义了一个排序规则,在调用排序方法时会默认根据待排序元素的这一内部规则来排序。
定制排序(Comparator)是针对(用于排序的)排序方法的,在排序方法的某个参数入口传入临时定义的排序规则,来对待排序元素进行排序。