Java比较器(对象排序)
2019-10-24 本文已影响0人
阿豪puls
Java实现排序的方式
- 自然排序:java.lang.Comparable
- 定制排序:java.lang.Comparator
自然排序
应用场景
1、Comparable接口强行对它的每一个子类进行整体排序,这种排序被称为类的自然排序(默认升序排序,从小到大)
2、实现了Comparable接口的对象,可在任何位置进行排序比较,没有使用范围的局限性
具体使用
1、实现Comparable接口的子类,必须重写compareTo(Object obj)方法
3、两个对象即通过compareTo(Object obj)方法的返回值来比较大小
4、如果当前对象this大于形参对象obj,刚返回正整数,如果小于返回负整数,如果等于返回0
5、对于实现过接口的子类,通过使用Collections.sort()或Arrays.sort()进行自动排序
代码举例
@Test
public void test1(){
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
//
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
定制排序
应用场景
1、需要排序的对象,没有实现java.lang.Comparable接口又不方便修改代码时
2、实现了自然排序,不满足业务需求时
3、实现了Comparable接口的对象,更偏向于临时性排序输出
具体使用
1、实现Comparator接口,重写compare(Object obj1,Object obj2)方法,比较o1和o2的大小
2、对于实现过接口的子类,通过使用Collections.sort()或Arrays.sort(),装载到容器中,进行定制排序
代码举例
@Test
public void test4(){
Goods[] arr = new Goods[6];
arr[0] = new Goods("lenovoMouse",34);
arr[1] = new Goods("dellMouse",43);
arr[2] = new Goods("xiaomiMouse",12);
arr[3] = new Goods("huaweiMouse",65);
arr[4] = new Goods("huaweiMouse",224);
arr[5] = new Goods("microsoftMouse",43);
Arrays.sort(arr, 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("输入的数据类型不一致");
}
});
System.out.println(Arrays.toString(arr));
}