关于比较,大家平日了解较多的可能都是基本类型相关的,比如比较个数字啦,首字母排序啦之类的;但大部分时候接收的数据都是被封装成对象的,要对对象中的某个数据进行比较并排序时,就不能随随便便调个Sort方法了。本文主要介绍Comparator接口的使用方法。
首先要明确,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()同理
那么回到一开始说的,我们需要排序的是一堆对象,比如说一堆学生,要根据他们的学号升序排列,运用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放在后