一、Comparable接口的使用举例
1、像String、包装类等实现了Comparable接口,重写了compareTo( ) 方法,给出了比较两个对象大小的方式。
2、像String、包装类重写compareTo( )方法后,进行了虫小到大的排列。
3、重写compareTo( )的规则:
如果当前对象this大于形参对象obj,则返回正整数。
如果当前对象this小于形参对象obj,则返回负整数。
如果当前对象this等于形参对象obj,则返回零。
4、对于自定义类如果需要排序可以实现Comparable接口重写compareTo( )方法。在compareTo( )方法中指明如何排序。
public class Goods implements Comparable { private String name; private double price; public Goods() { } 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(Object o) { if (o instanceof Goods) { Goods goods = (Goods) o; if (this.price > goods.price) { return 1; } if (this.price == goods.price) { return 0; } if (this.price < goods.price) { return -1; } } throw new RuntimeException("参数错误!"); } }
@Test public void test1(){ Goods[] arr = new Goods[4]; arr[0] = new Goods("联想",34); arr[1] = new Goods("戴尔",24); arr[2] = new Goods("华硕",50); arr[3] = new Goods("蓝天",80); Arrays.sort(arr); System.out.println(Arrays.toString(arr));//[Goods{name='戴尔', price=24.0}, Goods{name='联想', price=34.0}, Goods{name='华硕', price=50.0}, Goods{name='蓝天', price=80.0}] }
二、Comparator接口的使用:定制排序。
1、背景:当元素的类型没有实现Comparable接口而又不方便修改代码,或者实现了Comparable接口但排序规则不适合当前的操作,那么可以考虑使用Comparator对象来排序。
2、重写compare( Object o1 ,Object o2 )方法,比较O1和O2的大小。如果方法返回正数,则代表o1大于o2 ;如果返回0,则代表o1等于o2;如果返回负数,则o1小于o2。
@Test public void test3(){ Goods[] arr = new Goods[4]; arr[0] = new Goods("联想",34); arr[1] = new Goods("戴尔",24); arr[2] = new Goods("华硕",50); arr[3] = new Goods("蓝天",80); Arrays.sort(arr, new Comparator<Goods>() { @Override public int compare(Goods o1, Goods o2) { System.out.println("******************"); if (o1.getName().equals(o2.getName())){ return -Double.compare(o1.getPrice(),o2.getPrice()); }else { return -o1.getName().compareTo(o2.getName()); } } }); System.out.println(Arrays.toString(arr)); }