Java比较器

不想你离开。 提交于 2019-12-26 01:20:42

为什么要使用Java比较器

在平时的情况下,对象之间一般只存在 == 或者 ! = 关系,无法比较二个对象之间的大小。当如果在实际开发中,需要比较对象之间的某一个属性之间的大小,那么我们就可以使用到Java中的比较器。

Java中二种比较器

  1. 自然排序 :Comparable
  2. 定制排序 :Comparator

自然排序 :Comparable的使用

  1. 对象实现Comparable接口,并重写compareTo 方法
  2. 重写compareTo 的规则
    如果当前对象this大子形参对象obj,则返回正整数,
    如果当前对象this小于形参对象obj,则返回负整数,
    如果当前对象this等于形参对象obi,则返回零。.
  3. 举例 : 比如有一个商品类,商品类中存在二个属性,name 和 price,其中在多件商品中需要根据该商品的price进行从小到大的顺序进行排序

商品类

public class Goods implements  Comparable
{
    private String name;
    private int price;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getPrice()
    {
        return price;
    }

    public void setPrice(int price)
    {
        this.price = price;
    }

    @Override
    public String toString()
    {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    public Goods()
    {
    }

    public Goods(String name, int price)
    {
        this.name = name;
        this.price = price;
    }


    // 指定按照什么大小进行排序 ,比如按照价格从滴到高
    @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 0;
            }

        }else {
            throw  new  RuntimeException("二者类型不一致");
        }
    }
}

测试代码 如果该商品类不实现Comparable接口重写compareTo方法那在运行的时候会抛出 cannot be cast to java.lang.Comparable 异常信息

@Test
    public void CompareTest1()
    {

        Goods[] goods = new Goods[4];
        goods[0] = new Goods("ip7", 3500);
        goods[1] = new Goods("ip8", 4500);
        goods[2] = new Goods("ip6", 2500);
        goods[3] = new Goods("ipx", 5500);

        Arrays.sort(goods); 

        System.out.println(Arrays.toString(goods));

    }

定制排序 :Comparator

  1. 不需要实现该接口
  2. 创建匿名接口进行使用
 @Test
    public void CompareTest3()
    {

        Goods[] goods = new Goods[5];
        goods[0] = new Goods("ip7", 3500);
        goods[1] = new Goods("ip8", 4500);
        goods[2] = new Goods("ip6", 2600);
        goods[4] = new Goods("ip6", 2500);
        goods[3] = new Goods("ipx", 5500);


        Arrays.sort(goods, new Comparator()
        {
            @Override
            public int compare(Object o1, Object o2)
            {
                if(o1 instanceof  Goods && o2 instanceof  Goods){
                    Goods goods1 = (Goods) o1;
                    Goods goods2 = (Goods) o2;
                    if(goods1.getName().equals(goods2.getName())){ // 如果名字是一样的 那就按照价格从低到高进行排序
                        return Double.compare(goods1.getPrice(),goods2.getPrice());
                    }else{
                        return goods1.getName().compareTo(goods2.getName());
                    }
                }
                 throw  new RuntimeException("类型不一致");
            }
        });

        System.out.println(Arrays.toString(goods));

    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!