【java】Comparator的用法

【java】Comparator的用法为什么写 1 comparator 是 javase 中的接口 位于 java util 包下 javase 中的所有接口抽象度都很高 有必要重视 2 网上太多的文章告诉大家 comparator 是用来排序 确实 可以用来排序 但不仅限于排序 3 工作中实际需求出现很多需要使用 comparator 去处理的问题 在此总结一下

转载请标明出处:http://blog.csdn.net/u012250875/article/details/55126531

1.为什么写?

  1. comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用
  2. 大多数文章告诉大家comparator是用来排序,但我想说排序是comparator能实现的功能之一,他不仅限于排序

2.接口功能

该接口代表一个比较器,比较器具有可比性!大多数文章都写如何用comparator排序,是因为javase数组工具类和集合工具类中提供的sort方法sort就是使用Comparator接口来处理排序的,大家见久了都认为Comparator接口是用来排序的,按照java抽象的尿性来看,该接口如果为排序而生,应该叫Sortable,Sortor之类的名字吧!下面是javase一些使用到Comparator接口的地方:

Arrays.sort(T[],Comparator 
     super T> c); Collections.sort(List 
     
     list,Comparator 
      
       super T> c); 
    

3.使用场景

4.举个栗子

talk is cheap show me the code

package com.java.demo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; / * @author puyf */ public class SortTest { 
    class Dog{ public int age; public String name; public Dog(int age, String name) { super(); this.age = age; this.name = name; } @Override public String toString() { return "Dog [age=" + age + ", name=" + name + "]"; } } public static void main(String[] args) { List 
  
    list= 
   new ArrayList<>(); list.add( 
   new SortTest(). 
   new Dog( 
   5, 
   "DogA")); list.add( 
   new SortTest(). 
   new Dog( 
   6, 
   "DogB")); list.add( 
   new SortTest(). 
   new Dog( 
   7, 
   "DogC")); Collections.sort(list, 
   new Comparator 
   
     () { 
    @Override 
    public 
    int 
    compare(Dog o1, Dog o2) { 
    return o2.age - o1.age; } }); System.out.println( 
    "给狗狗按照年龄倒序:"+list); Collections.sort(list, 
    new Comparator 
    
      () { 
     @Override 
     public 
     int 
     compare(Dog o1, Dog o2) { 
     return o1.name.compareTo(o2.name); } }); System.out.println( 
     "给狗狗按名字字母顺序排序:"+list); } } 
     
    
  
package com.java.demo; import java.util.ArrayList; import java.util.Comparator; import java.util.List; / * @author puyf */ public class GroupTest { 
    class Apple { public String color; public int weight; public Apple(String color, int weight) { super(); this.color = color; this.weight = weight; } @Override public String toString() { return "Apple [color=" + color + ", weight=" + weight + "]"; } } / * @author puyf * @Description:按条件分组 * @param datas * @param c * 是否为同一组的判断标准 * @return */ public static 
  
    List 
   
     > 
    divider(Collection 
    
      datas, Comparator 
     super T> c) { List 
     
       > result = 
      new ArrayList 
      
        >(); 
       for (T t : datas) { 
       boolean isSameGroup = 
       false; 
       for ( 
       int j = 
       0; j < result.size(); j++) { 
       if (c.compare(t, result.get(j).get( 
       0)) == 
       0) { isSameGroup = 
       true; result.get(j).add(t); 
       break; } } 
       if (!isSameGroup) { 
       // 创建 List 
       
         innerList = 
        new ArrayList 
        
          (); result.add(innerList); innerList.add(t); } } 
         return result; } 
         public 
         static 
         void 
         main(String[] args) { List 
         
           list = 
          new ArrayList<>(); list.add( 
          new GroupTest(). 
          new Apple( 
          "红", 
          205)); list.add( 
          new GroupTest(). 
          new Apple( 
          "红", 
          131)); list.add( 
          new GroupTest(). 
          new Apple( 
          "绿", 
          248)); list.add( 
          new GroupTest(). 
          new Apple( 
          "绿", 
          153)); list.add( 
          new GroupTest(). 
          new Apple( 
          "黄", 
          119)); list.add( 
          new GroupTest(). 
          new Apple( 
          "黄", 
          224)); List 
          
            > byColors = divider(list, 
           new Comparator 
           
             () { 
            @Override 
            public 
            int 
            compare(Apple o1, Apple o2) { 
            // 按颜色分组 
            return o1.color.compareTo(o2.color); } }); System.out.println( 
            "按颜色分组" + byColors); List 
            
              > byWeight = divider(list, 
             new Comparator 
             
               () { 
              @Override 
              public 
              int 
              compare(Apple o1, Apple o2) { 
              // 按重量级 
              return (o1.weight / 
              100 == o2.weight / 
              100) ? 
              0 : 
              1; } }); System.out.println( 
              "按重量级分组" + byWeight); } } 
              
             
            
           
          
         
        
       
      
     
    
  

5.总结

一般需要做比较的逻辑都可以使用的上Comparator,最常用的场景就是排序和分组,排序常使用Arrays和Collections的sort方法,而分组则可以使用上面提供的divider方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207113.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:24
下一篇 2026年3月19日 下午2:25


相关推荐

  • mysql导入Excel表格中文表头_把一个表里的数据导入另一个表

    mysql导入Excel表格中文表头_把一个表里的数据导入另一个表一,Linux版本1.先把Excel的xls格式转为csv3.用notepad++转为uft8编码4.然后转为txt格式5.将本地文件上传到服务器上选择数据库5.创建表格式要跟Excel一样createtableclass(idvarchar(20),namevarchar(20),chinesevarchar(20),mathvarchar(20),englishvarchar(20),physicsvarchar(20)

    2026年2月10日
    5
  • Manus完成7500万美元融资:全球化布局加速,智能体生态构建新格局

    Manus完成7500万美元融资:全球化布局加速,智能体生态构建新格局

    2026年3月15日
    3
  • 【OpenClaw】——绿联NAS部署OpenClaw

    【OpenClaw】——绿联NAS部署OpenClaw

    2026年3月13日
    2
  • DataFormatString属性

    DataFormatString属性ASP NET 如何在 GridView 中使用 DataFromatSt 在我们从业务逻辑层获得数据实体时候 接下来的事情就是要绑定到控件中 数据实体中的一些字段可以直接绑定到界面中 但是有一些字段需要重新格式化格式 比如货币单位字段 需要显示货币符号和每隔三位显示分隔符 再比如日期字段 数据库中存放的是日期和时间 但是在界面上需要

    2026年3月19日
    2
  • verifycode验证码模版「建议收藏」

    verifycode验证码模版「建议收藏」#-*-coding:utf-8-*-fromdjango.shortcutsimportHttpResponsedefverifycode(request):#引入绘图模块fromPILimportImage,ImageDraw,ImageFont#引入随机函数模块importrandom#定义变量,…

    2022年7月15日
    15
  • 免费好用的cdn_如何查询cdn提供商

    免费好用的cdn_如何查询cdn提供商CDN介绍CDN也称内容分发网络,其原理大概是将服务内容分发至全网加速节点,让用户从就近的服务器节点上获取内容,从而提高网站的访问速度。大部分服务商(如阿里云,网易蜂巢,京东云等)的CDN服务是按使用量收费的,也有一些服务商提供免费的CDN服务,本文简单的总结一下目前可免费使用的CDN,对个人网站来说,免费的已经够用了。腾讯云CDN腾讯云CDN官网:https://cloud.tencent.com/product/cdn腾讯云可以免费申请SSL证书,腾讯云CDN也能很好的支持SSL证书,从而实

    2025年10月21日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号