java积累(一)------后端---Comparator比较器的用法

本文详细介绍了如何使用Comparator接口自定义比较规则,实现数组、List、Map等复杂数据类型的排序,包括文本内容的自定义排序,并提供了实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



对数组或者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());  
    }  
}  

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






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

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

JDK 源代码阅读之 TimSort







评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿泽财商会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值