Java 比较器

一、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));
    }

 

上一篇:Redis 缓存穿透、击穿和雪崩


下一篇:RobotFramework自动化测试框架的基础关键字(二)