对数组或者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方法

 


 
  1. Comparator<User> comp=new Comparator<User>(){

  2. //升序

  3. public int compare(User o1,User o2){

  4. if(o1.getAge()>o2.getAge()){

  5. return 1;

  6. }else if(o1.getAge()==o2.getAge()){

  7. return 0;

  8. }else{

  9. return -1;

  10. }

  11. }

  12. };

 

也可以新建内部类或者外部类如下:

 

 


 
  1. public class UserAgeComparator implements Comparator<User> {

  2.  
  3.  
  4. //升序

  5. public int compare(User o1,User o2){

  6. if(o1.getAge()>o2.getAge()){

  7. return 1;

  8. }else if(o1.getAge()==o2.getAge()){

  9. return 0;

  10. }else{

  11. return -1;

  12. }

  13. }

  14.  
  15.  
  16. }


使用比较器

 


 
  1. Collections.sort(users,comp);

  2. Collections.reverse(users);//反转排序

如果是类的的话需要先实例化再使用

 

 


 
  1. UserAgeCompartor mc = new UserAgeCompartor ();

  2. Collections.sort(list, mc);

 

自定义比较器----文本比较

上述的使用方法已经能够满足大部分的使用场景。只需要我们处理compare函数中的比较逻辑即可。(包括数组,字符串长度,时间等的比较都能满足)。

但是如果要比较文本内容的话,还是自定义比较器规则会方便一些。使用步骤也是一样的,只是在compare方法中我们需要定义一个规则器。

 


 
  1. package com.test;  

  2.   

  3.   

  4. import java.text.ParseException;  

  5. import java.text.RuleBasedCollator;  

  6. import java.util.Comparator;  

  7. import com.test.domain.User;  

  8.  
  9.  
  10. public class UserNameComparator implements Comparator<User> {  

  11.    

  12.     @Override  

  13.     public int compare(User o1, User o2) {  

  14.        String myrule = "<王<赵<李<张";   

  15.        RuleBasedCollator myrulecollato = null;  

  16.        try {  

  17.            myrulecollato = new RuleBasedCollator(myrule);  

  18.        } catch (ParseException e) {  

  19.           e.printStackTrace();  

  20.        }  

  21.        return myrulecollato.compare(o1.getUsername(), o2.getUsername());  

  22.     }  

  23. }  


这里 "王<赵<李<张" 就是我们规定的文本内容排序规则,这样的话 有王字的就会排在前面了。如果出现文本模糊匹配不准确的出来的排序不准确的话,只需要把全名写上就能准确排序了,比如"王五<赵六<李四<张三"  

如果需要了解原理的话 建议查看这两篇。

List的sort中的Comparator的使用和原理

帖子状态

话题参与者

回复显示排序:

给大家安利一款免费的在线流程图设计软件:贼好用 ProcessFlow — 免费在线作图、实时协作 ProcessFlow是一个在线作图工具的聚合平台, 它可以在线画流程图、思维导图、UI原型图、UML、网络拓扑图、组织结构图等等, 您无需担心下载和更新的问题, 不管Mac还是Windows,一个浏览器就可以随时随地的发挥创意,规划工作,解放您的双手,让您腾出双手去成就别人的梦想。

Finally!
有没有特别的设计建议或更新的指南?
Finally!
您好,这边没有的。
tesla02 best answer
6 Jan,2019
Finally!
有没有特别的设计建议或更新的指南?
此帖子已被版主标记,收到太多否决票。

这是太大的预览图像,它应该更小,甚至五行。在一个页面上有30到60个页面,它是1800个项目 类别例如在附加组件类别有22749个项目,为什么不看到所有的项目,但只有那1800个项目?这是件坏事。

看起来您是个新人,欢迎免费注册社区,加入我们的大家庭,一起学习,一起成长。
提交你的评论
System.out.println("请输入你的代码块...");
话题
分类
喜欢
回复
浏览
活跃
原创社区
985
0
1.5k
原创社区
985
1
1.5k
20/12/25 22:32:21
javaWeb
985
1
1.5k
20/06/15 22:09:21
youtube
698
78
2.1k
3d
Settings

请插入代码块