Comparator比较器

        关于比较,大家平日了解较多的可能都是基本类型相关的,比如比较个数字啦,首字母排序啦之类的;但大部分时候接收的数据都是被封装成对象的,要对对象中的某个数据进行比较并排序时,就不能随随便便调个Sort方法了。本文主要介绍Comparator接口的使用方法。

1.概念

        首先要明确,Comparator是一个接口类,我们需要实现该类并重写其中的compare方法,来自定义比较逻辑。那么这个逻辑应该如何编写,看看下面这段。

//在重写compare的比较逻辑时,只需要记住一个原则:
//返回-1就是不交换,返回1就是需要交换

//那么看下面的代码

@Override
public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? 1 : -1;
}
//当o1<o2时返回1,说明小数需要交换到后面去,那么最终结果应该呈现为降序

@Override
public int compare(Integer o1, Integer o2) {
    return o1 > o2 ? -1 : 1;
}
//再看这种情况,当o1>o2时返回-1,不需要交换,说明大数就应放在前面,那么最终结果应该仍然呈现为降序

         在明确了基本的使用逻辑后,就可以构建一个比较器,配合Collections.sort()或Arrays.sort()来对目标数组/列表进行操作了。下面就是一个最简单的升序排列逻辑。

Collections.sort(stuList, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 < o2 ? -1 : 1;
    }
});
//Arrays.sort()同理

2.应用

        那么回到一开始说的,我们需要排序的是一堆对象,比如说一堆学生,要根据他们的学号升序排列,运用Comparator也可以很简单实现。

//根据学号升序排序
Collections.sort(stuList, new Comparator<EmStudent>() {
    @Override
    public int compare(EmStudent o1, EmStudent o2) {
        Integer stuNumber1 = Integer.parseInt(o1.getStuNumber());
        Integer stuNumber2 = Integer.parseInt(o2.getStuNumber());
        return stuNumber1 < stuNumber2 ? -1 : 1;
    }
});

        但如果我们要按学生姓名升序排列呢?

        可能大伙第一反应还是简单的调用Sort方法,但这里是China,我们的名字不是Jack/Rose/Lily,而是张三/李四/王五,那么该如何比较呢?

        这个时候就要用到Comparator的一个实现类:Collator类,这个类主要用于String类型的比较,其中就包含了中文。

//先使用静态工厂方法来获取Collator的实例对象,指定语言为中文
Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);

//再将该比较器对象放入sort方法中
Collections.sort(stuList, new Comparator<EmStudent>() {
    @Override
    public int compare(EmStudent o1, EmStudent o2) {
        return comparator.compare(o1.getStuName(), o2.getStuName());
    }
});
//当前排序模式为升序,如需要降序排序,则将o2放在前,o1放在后

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值