对数组或者List列表,或者Map(非hash)等排序是我们经常使用的一种处理数据的手段。Comparator接口是java中很方便的一个接口。
我们只需要重写compare方法即可实现排序。
int compare(Object o1, Object o2) 返回一个基本类型的整型
如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
如果要按照降序排序
则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)
使用步骤
新建比较器并重写compare方法
-
Comparator<User> comp=new Comparator<User>(){
-
//升序
-
public int compare(User o1,User o2){
-
if(o1.getAge()>o2.getAge()){
-
return 1;
-
}else if(o1.getAge()==o2.getAge()){
-
return 0;
-
}else{
-
return -1;
-
}
-
}
-
};
也可以新建内部类或者外部类如下:
-
public class UserAgeComparator implements Comparator<User> {
-
//升序
-
public int compare(User o1,User o2){
-
if(o1.getAge()>o2.getAge()){
-
return 1;
-
}else if(o1.getAge()==o2.getAge()){
-
return 0;
-
}else{
-
return -1;
-
}
-
}
-
}
使用比较器
-
Collections.sort(users,comp);
-
Collections.reverse(users);//反转排序
如果是类的的话需要先实例化再使用
-
UserAgeCompartor mc = new UserAgeCompartor ();
-
Collections.sort(list, mc);
自定义比较器----文本比较
上述的使用方法已经能够满足大部分的使用场景。只需要我们处理compare函数中的比较逻辑即可。(包括数组,字符串长度,时间等的比较都能满足)。
但是如果要比较文本内容的话,还是自定义比较器规则会方便一些。使用步骤也是一样的,只是在compare方法中我们需要定义一个规则器。
-
package com.test;
-
-
-
import java.text.ParseException;
-
import java.text.RuleBasedCollator;
-
import java.util.Comparator;
-
import com.test.domain.User;
-
public class UserNameComparator implements Comparator<User> {
-
-
@Override
-
public int compare(User o1, User o2) {
-
String myrule = "<王<赵<李<张";
-
RuleBasedCollator myrulecollato = null;
-
try {
-
myrulecollato = new RuleBasedCollator(myrule);
-
} catch (ParseException e) {
-
e.printStackTrace();
-
}
-
return myrulecollato.compare(o1.getUsername(), o2.getUsername());
-
}
-
}
这里 "王<赵<李<张" 就是我们规定的文本内容排序规则,这样的话 有王字的就会排在前面了。如果出现文本模糊匹配不准确的出来的排序不准确的话,只需要把全名写上就能准确排序了,比如"王五<赵六<李四<张三"
如果需要了解原理的话 建议查看这两篇。
给大家安利一款免费的在线流程图设计软件:贼好用 ProcessFlow — 免费在线作图、实时协作 ProcessFlow是一个在线作图工具的聚合平台, 它可以在线画流程图、思维导图、UI原型图、UML、网络拓扑图、组织结构图等等, 您无需担心下载和更新的问题, 不管Mac还是Windows,一个浏览器就可以随时随地的发挥创意,规划工作,解放您的双手,让您腾出双手去成就别人的梦想。