Java Comparator的使用

这是啥?

Comparator是个接口,是一个比较器,常用内部类的方式实现,常用于实现某个类的比较规则

怎么用?

场景:假如有一个字符串集合list,一共有10个元素,乱序的。现有排序规则order,根据规则对list重新排序,前4个元素按order排,其余保持原顺序。

定义一个类实现Comparator接口,重写Compare方法

    public static void main(String[] args) {
        List<String> list = Arrays.asList("皎月", "盲僧", "乌迪尔", "纳尔", "瑞兹", "卡萨", "韦恩", "亚托克斯", "奶妈", "诺手");
        System.out.println("list = " + list);
        List<String> order = Arrays.asList("韦恩", "纳尔", "诺手", "乌迪尔");

        class listCompare implements Comparator<String> {

            @Override
            public int compare(String o1, String o2) {
                // 找到比较元素的索引,如果o1,o2不在order列表中,indexOf方法返回-1
                int i1 = order.indexOf(o1);
                int i2 = order.indexOf(o2);

                i1 = i1 == -1? Integer.MAX_VALUE:i1;
                i2 = i2 == -1? Integer.MAX_VALUE:i2;
                return i1-i2;
            }
        }

        list.sort(new listCompare());
        System.out.println("list = " + list);
    }

结果怎样?

在这里插入图片描述

怎么理解?

先看list.sort(new listCompare());
其实就是一个集合排序,排序的规则就是listCompare类。具体的排序逻辑就是重写的compare方法。
接下来看compare方法

@Override
public int compare(String o1, String o2) {
    // 找到比较元素的索引,如果o1,o2不在order列表中,indexOf方法返回-1
    int i1 = order.indexOf(o1);
    int i2 = order.indexOf(o2);

    i1 = i1 == -1? Integer.MAX_VALUE:i1;
    i2 = i2 == -1? Integer.MAX_VALUE:i2;
    return i1-i2;
}

o1,o2表示两个比较的对象,i1,i2是o1,o2在order集合中的索引,当元素不在集合中时,返回的结果是-1。
当元素不在集合中时,重新赋值为MAX_INTEGER,最大值。
compara方法排序的依据是看return的结果:(和Java默认排序有关,默认按升序排序,所以排后面的值要更大,即i1<i2才行)
i1-i2 < 0,o1排在o2前面
i1-i2 = 0,o1和o2顺序保持不变,并列
i1-i2 > 0,o1排在o2后面

所以,当比较“韦恩”和“盲僧”时,i1 = 0,i2 = MAX_VALUE,i1-i2 < 0,所以“韦恩”排在“盲僧”前面。
从整个order来看,“韦恩"索引为0,所以它是最小的,所以排在最前面。以此类推,找到order剩下的元素。
而不在order中的元素,由于两个元素i1=i2=MAX_VALUE,所以i1-i2=0,两者的相对顺序不改变,即保持原来顺序。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值