早茶月光个人博客

愿居于一城,与卿所见美好......

推荐文章

java比较器的几种用法

    对数组或者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. 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. 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. public class UserNameComparator implements Comparator<User> {  
    9.    
    10.     @Override  
    11.     public int compare(User o1, User o2) {  
    12.        String myrule = "<王<赵<李<张";   
    13.        RuleBasedCollator myrulecollato = null;  
    14.        try {  
    15.            myrulecollato = new RuleBasedCollator(myrule);  
    16.        } catch (ParseException e) {  
    17.           e.printStackTrace();  
    18.        }  
    19.        return myrulecollato.compare(o1.getUsername(), o2.getUsername());  
    20.     }  
    21. }  


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

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

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

    阅读全文>>

作者:早茶月光分类:【javaEE浏览(246评论(0

2020-11-30 11:09:15