比较器Comparable、Comparator
Comparable接口的使用(自然排序)
1.String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式. String、包装类重写了compareTo()方法以后,进行了从小到大的排序。
2.重写compareTo(obj)规则:
如果当前对象this大于形参对象obj,则返回正整数。
如果当前对象this小于形参对象obj,则返回负整数。
如果当前对象this等于形参对象obj,则返回0
3.对于自定义类,如果需要排序,让自定义类实现Comparable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序。
public class Goods implements Comparable<Goods>{
private String name;
private double price;
public Goods(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Goods{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
//按照价格从低到高排序,再按照产品名称从高到底排序
@Override
public int compareTo(Goods o) {
//方式一
if(this.price>o.price){
return 1;
}else if(this.price<o.price){
return -1;
}else {
//return 0;
return -this.name.compareTo(o.name);
}
//方式二
//return Double.compare(this.price,o.price);
}
}
@Test
public void test1(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("bbb",35);
arr[1]= new Goods("eee",15);
arr[2]= new Goods("ddd",55);
arr[3]= new Goods("aaa",25);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//[Goods{name='eee', price=15.0}, Goods{name='aaa', price=25.0}, Goods{name='bbb', price=35.0}, Goods{name='ddd', price=55.0}]
}
Comparator定制排序
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
o1>o2:方法返回正整数。
o1<o2:方法返回负整数
o1=o2:方法返回0
可以将Comparator传递给sort方法,如Collections.sort或Arrays.sort,从而允许在排序顺序上实现精确控制。
public class ComparaTest {
@Test
public void test1(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("bbb",35);
arr[1]= new Goods("eee",15);
arr[2]= new Goods("ddd",55);
arr[3]= new Goods("aaa",25);
//价格从高到底排序
Arrays.sort(arr, new Comparator<Goods>() {
@Override
public int compare(Goods o1, Goods o2) {
return -Double.compare(o1.getPrice(),o2.getPrice());
}
});
System.out.println(Arrays.toString(arr));
//[Goods{name='ddd', price=55.0}, Goods{name='bbb', price=35.0}, Goods{name='aaa', price=25.0}, Goods{name='eee', price=15.0}]
}
}

浙公网安备 33010602011771号