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);
    }

结果怎样?

Java Comparator的使用_第1张图片

怎么理解?

先看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 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,两者的相对顺序不改变,即保持原来顺序。

你可能感兴趣的:(java,数据结构,算法)