Comparator<T>和Comparable<T>

小红编写了一个Money类,打包成了jar包供我们使用。当我们需要比较两个Money对象的大小或对集合进行排序时,如果该类实现了Comparable<T>,则会实现compareTo(T o)方法,我们只需调用即可。但如果该类没实现Comparable<T>接口,我们该怎么办呢?让小红修改一下Money类?不太可能,这时需要用到Comparator<T>接口,该接口在不修改类的情况下可以实现对象比较大小或集合排序。

示例如下:

一、实现Comparable<T>接口进行对象大小比较或集合排序

1.Person类实现了Comparable<T>

public class Person implements Comparable<Person>{


    private Double value;

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    /**
     * 用于集合排序则为升序
     * @param o
     * @return
     */
    @Override
    public int compareTo(Person o) {
        return this.value.compareTo(o.getValue());
    }
}

2.Person对象比较大小或集合进行排序

   /**
     * Person对象比较大小
     */
    @Test
    public void personCompareOne(){
        Person p = new Person();
        p.setValue(Math.random());
        Person e = new Person();
        e.setValue(Math.random());
        int num=p.compareTo(e);
        Assert.assertNotNull(num);
    }

    /**
     * Person集合进行升序排序
     */
    @Test
    public void personCompareList(){
        List<Person> people=new ArrayList<Person>();
        for(int i=0;i<10;i++){
            Person person = new Person();
            person.setValue(Math.random());
            people.add(person);
        }
        Collections.sort(people);
        Assert.assertNotNull(people);
    }

二、没实现Comparable<T>类,使用Comparator<T>进行对象大小比较或集合排序

1.Money类没实现Comparator<T>,但有一个私有类

public class Money {

    private Double value;

    public static final Comparator<Money> MONEY_COMPARATOR=new MoneyComparator();

    private static class MoneyComparator implements Comparator<Money>,java.io.Serializable{

        /**
         * 升序排序
         * @param o1
         * @param o2
         * @return
         */
        @Override
        public int compare(Money o1, Money o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    }

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

}

2.Money对象实现比较大小或集合排序

   /**
     * Money对象比较大小
     */
    @Test
    public void moneyCompareOne(){
        Money m = new Money();
        m.setValue(Math.random());
        Money o = new Money();
        o.setValue(Math.random());
        int num=Money.MONEY_COMPARATOR.compare(m,o);
        Assert.assertNotNull(num);
    }

    /**
     * Money集合进行升序排序
     */
    @Test
    public void testAdd(){
        List<Money> monies=new ArrayList<Money>();
        for(int i=0;i<10;i++){
            Money money =new Money();
            money.setValue(Math.random());
            monies.add(money);
        }
        Collections.sort(monies,Money.MONEY_COMPARATOR);
        Assert.assertNotNull(monies);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值