Comparable 接口的使用: 自然排序
1.像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式
2.像String、包装类重写compareTo()方法之后,进行了从小到大的排列
例如:
@Test
public void test1(){
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
结果为:
3.重写compareTo(obj)的规则:
如果当前对象this大于形参对象obj,则返回正整数
如果当前对象this小于形参对象obj,则返回复数
如果当前对象this等于形参对象obj,则返回0
4.对于自定义类来说,如果要排序,可以让自定义类实现Comparable接口,重写compareTo()方法,在compareTo(obj)方法中指明如何排序
例如:
package base.compare;
/**
* @author Feifu
* @create 2020-03-20
*
* 商品类
*/
public class Goods implements Comparable<Goods>{//指定泛型
private String name;
private double price;
//这里省略getter/setter,构造方法和toString()方法
//指明商品比较大小的方式:先按照价格从低到高排序
@Override
public int compareTo(Goods goods) {
if (this.price > goods.price) {
return 1;
} else if (this.price < goods.price) {
return -1;
} else {
return 0;
}
}
}
测试:
@Test
public void test2(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("8848",8848);
arr[1] = new Goods("o泡果奶",10);
arr[2] = new Goods("n夫山泉",2);
arr[3] = new Goods("m服限定",199);
Arrays.sort(arr);
for (Goods goods : arr) {
System.out.println(goods);
}
}
排序结果:
可以根据需求在compareTo()中修改相应的逻辑
//指明商品比较大小的方式:先按照价格从低到高排序,在按照产品名称从高到低排序
@Override
public int compareTo(Goods goods) {
if (this.price > goods.price) {
return 1;
} else if (this.price < goods.price) {
return -1;
} else {
// return 0;
return -this.name.compareTo(goods.name);
}
}
Comparator接口的使用: 定制排序
1.使用场景
当元素的类型没有实现Comparable接口而又不方便修改代码
或者实现了Comparable接口的排序规则不适合当前的操作,那么就可以使用Comparator的对象来排序
2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小;
如果返回正整数,表示o1大于o2
如果返回负整数,表示o1小于o2
如果返回0,表示o1等于o2
例如:
@Test
public void test3(){
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr, new Comparator<String>() {//使用匿名对象
@Override
public int compare(String o1, String o2) {
//按照字符串从大到小顺序排列
return -o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(arr));
}
自定义类使用定制排序
@Test
public void test4(){
Goods[] arr = new Goods[5];
arr[0] = new Goods("8848",8848);
arr[1] = new Goods("o泡果奶",2);
arr[2] = new Goods("n夫山泉",2);
arr[3] = new Goods("m服限定",199);
arr[4] = new Goods("opgn",10);
Arrays.sort(arr, new Comparator<Goods>() {//使用匿名对象
@Override
public int compare(Goods o1, Goods o2) {
//先按照产品名称从低到高,再按照价格从高到低
if(o1.getName().equals(o2.getName())){
//名称相同时,比较价格
return -Double.compare(o1.getPrice(),o2.getPrice());
} else {
return o1.getName().compareTo(o2.getName());
}
}
});
for (Goods goods : arr) {
System.out.println(goods);
}
}