Java Comparable和Comparator

Java中在进行数据排序时,Comparable和Comparator必不可少会遇得到,普通的String、Integer等类型,已经实现了Comparable接口,而有些时候,我们需要对一些其他不存在内在排序关系的类进行排序,那么就需要实现以上两个接口,但是会有所不同。

之前搜索两者的关系,看到这样一篇文章,Comparable与Comparator的区别,里面有些说法有点太深奥,不过我来总结的话,两者最大的区别就在于如果实现Comparable,就意味着类的排序规则固定了,而如果实现Comparator,类本身是没有排序规则的,只是通过制定外部规则使其进行排序,排序规则你可以指定很多类型

那么就且来看看我做的一个例子,我们新建一个美女类(BeautyGirl),使其具有年龄(age)、身高(height)属性,姑且按照年龄优先于身高的原则来进行排序,那么实现方式就有下面的方式。

Comparable

package com.mwq.comparable;

public class BeautyGirl implements Comparable<BeautyGirl> {
    private int age;
    private Double height;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }

    @Override
    public int compareTo(BeautyGirl girl) {
        if (this.getAge() == girl.getAge()) {
            return compareHeight(girl);
        } else {
            return this.getAge() - girl.getAge();
        }
    }

    private int compareHeight(BeautyGirl girl) {
        return girl.getHeight().compareTo(this.getHeight());
    }

    @Override
    public String toString() {
        return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
    }

}

实现comparable接口,就意味着需要在美女类中实现compareTo方法,也就是说,该类在排序的时候必须是年龄优先于身高。

来看看测试类

package com.mwq.comparable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<BeautyGirl> girls = new ArrayList<BeautyGirl>();

        BeautyGirl girl = new BeautyGirl();
        girl.setAge(28);
        girl.setHeight(170.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(25);
        girl.setHeight(183.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(28);
        girl.setHeight(180.30);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(32);
        girl.setHeight(170.00);
        girls.add(girl);

        girl = new BeautyGirl();
        girl.setAge(21);
        girl.setHeight(170.00);
        girls.add(girl);

        for (BeautyGirl beautyGirl : girls) {
            System.out.println(beautyGirl);
        }

        Collections.sort(girls);
        System.out.println("排序一下---------------------------------------------");

        for (BeautyGirl beautyGirl : girls) {
            System.out.println(beautyGirl);
        }
    }

}

输出结果如下

美女{年龄:28身高:170.0}
美女{年龄:25身高:183.0}
美女{年龄:28身高:180.3}
美女{年龄:32身高:170.0}
美女{年龄:21身高:170.0}
排序一下---------------------------------------------
美女{年龄:21身高:170.0}
美女{年龄:25身高:183.0}
美女{年龄:28身高:170.0}
美女{年龄:28身高:180.3}
美女{年龄:32身高:170.0}

Comparator

package com.mwq.comparator;

public class BeautyGirl {
    private int age;
    private Double height;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
    }

}
package com.mwq.comparator;

import java.util.Comparator;

/**
 * 实现美女的排序
 */
public class BeautyGirlComparator implements Comparator<BeautyGirl> {

    @Override
    public int compare(BeautyGirl girl1, BeautyGirl girl2) {
        // 姑且把年龄放在第一位
        if (girl1.getAge() == girl2.getAge()) {
            return compareHeight(girl1, girl2);
        } else {
            return girl1.getAge() - girl2.getAge();
        }
    }

    private int compareHeight(BeautyGirl girl1, BeautyGirl girl2) {
        // 把身高放在第二位
        return girl1.getHeight().compareTo(girl2.getHeight());
    }

}
Collections.sort(girls, new BeautyGirlComparator());

这样是使用排序的时候,只要你指定一个新的规则,就会按照新的规则来排序,而不需要再变更BeautyGirl类。例如,你可以按照身高优先、年龄次之的排序。

总结两者的区别就在于排序规则的制定,如果排序规则善变,那么使用comparator是个好办法,如果规则固定,实现comparable更好,至少少写一个类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值