关于 自然排序 与定制排序
应用场景。
这些商品就是一个个的对象,我们将它按照不同属性排序。比如说价格,销量或者评价等等。
在代码中我们声明为一个商品类,属性有价格和品牌
这里只保留了compareTo方法的重写,在compareTo方法中声明排序规则。这里是对价格进行排序,若相同则比较品牌名字。其中name是String类型,它本身已经重写compareTo方法。
public class Goods implements Comparable{
private double price;
private String name;
@Override
public int compareTo(Object o) {
if(o instanceof Goods){
Goods goods=(Goods)o;
if(this.price<goods.price){
return -1;
}else if(this.price> goods.price){
return 1;
}else{
return this.name.compareTo(((Goods) o).name);
}
}
throw new RuntimeException("类型异常");
}
}
在另一个测试类中,代码如下
@Test
public void test(){
Goods goods[] =new Goods[5];
goods[0] =new Goods(13,"logic");
goods[1] =new Goods(18,"dell");
goods[2] =new Goods(45,"mi");
goods[3] =new Goods(36,"huawei");
goods[4] =new Goods(36,"meizu");
Arrays.sort(goods);
System.out.println(Arrays.toString(goods));
}
其中Arrays是一个工具类,其中包含了各种静态方法,可用来操作Array。Array是集合的一种,实现类包括ArrayList,LinkedList,Vactor。
若我们不想使用某一个类的排序规则,或者对String默认的compareTo方法不满意,可以通过定制排序来满足我们的需求。
定制排序的方法是,声明一个comparator比较器(定义排序规则),使用.sort(arr,comparator)的构造器,
Arrays.sort(goods, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Goods&& o2 instanceof Goods){
Goods g1=(Goods) o1;
Goods g2=(Goods) o2;
if(g1.getName().equals(g2.getName())){
return Double.compare(g1.getPrice(), g2.getPrice());
}else{
return g1.getName().compareTo(g2.getName());
}
}
throw new RuntimeException("类型错误");
}
});
这次是对名称进行比较,若相同则对价格进行比较。