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