【java】Comparator的用法

Comparator几种方法的详细用法 在上面的例子中,我们首先创建了一个包含多个字符串和null的List,然后使用nullsLast方法创建了一个自然顺序比较器,并将其传递给Collections.sort方法,以便对List进行排序。Comparator中的nullsLast方法用于定义当比较的对象为null时,应该如何进行比较。Comparator是Java中的一个接口,它定义了用于比较两个对象的方法。如果两个对象相等,则返回true;可以看到,在排序后的List中,所有的字符串都按照自然顺序进行排列,而null值则被排在了最后面。 阅读详情

转载请标明出处:http://blog.youkuaiyun.com/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<T> list,Comparator<? super T> c);
  • 1
  • 2

3.使用场景

什么场景需要做比较,那么什么场景就是Comparator接口的用武之地,我总结的两个场景: 
1. 排序,需要比较两个对象谁排在前谁排在后(排序也可以让类实现Comparable接口,实现后该类的实例也具有排序能力)。 
2. 分组,需要比较两个对象是否是属于同一组。 
3. 待补充

4.举个栗子

1.排序 
在List或数组中的对象如果没有实现Comparable接口时,那么就需要调用者为需要排序的数组或List设置一个Compartor,Compartor的compare方法用来告诉代码应该怎么去比较两个实例,然后根据比较结果进行排序

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<Dog> 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<Dog>() {

        @Override
        public int compare(Dog o1, Dog o2) {
        return o2.age - o1.age;
        }
    });
    System.out.println("给狗狗按照年龄倒序:"+list);
    Collections.sort(list, new Comparator<Dog>() {

        @Override
        public int compare(Dog o1, Dog o2) {
        return o1.name.compareTo(o2.name);
        }
    });
    System.out.println("给狗狗按名字字母顺序排序:"+list);
    }
}

2.分组 
使用Comparator和for循环处理列表,来进行分类;通过调用者实现Comparator接口的比较逻辑,来告诉程序应该怎么比较,通过比较之后得结果来进行分组。比如生活中的拳击比赛,会有公斤级的概念,那么程序中应该实现的处理逻辑是只要两个人的体重在同一个区间则为同一组公斤级的选手。下面例子中分别按照狗狗的颜色和体重级别两个维度来进行分组,因此分组的核心逻辑其实就是比较逻辑。相面我抽了一个工具方法:dividerList,第一个参数为需要处理的数据源,第二参数是分组时的比较逻辑。

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 <T> List<List<T>> divider(Collection<T> datas, Comparator<? super T> c) {
        List<List<T>> result = new ArrayList<List<T>>();
        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<T> innerList = new ArrayList<T>();
                result.add(innerList);
                innerList.add(t);
            }
        }
        return result;
    }

    public static void main(String[] args) {
    List<Apple> 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<List<Apple>> byColors = divider(list, new Comparator<Apple>() {

        @Override
        public int compare(Apple o1, Apple o2) {
        // 按颜色分组
        return o1.color.compareTo(o2.color);
        }
    });
    System.out.println("按颜色分组" + byColors);
    List<List<Apple>> byWeight = divider(list, new Comparator<Apple>() {

        @Override
        public int compare(Apple o1, Apple o2) {
        // 按重量级

        return (o1.weight / 100 == o2.weight / 100) ? 0 : 1;
        }
    });
    System.out.println("按重量级分组" + byWeight);
    }
}

结果如下(为了方便看,手动回车换行格式化了下): 
按颜色分组 
[ 
[ 
Apple [color=红, weight=205], 
Apple [color=红, weight=131] 
], 
[ 
Apple [color=绿, weight=248], 
Apple [color=绿, weight=153] 
], 
[ 
Apple [color=黄, weight=119], 
Apple [color=黄, weight=224] 
] 
]

按重量级分组 
[ 
[ 
Apple [color=红, weight=205], 
Apple [color=绿, weight=248], 
Apple [color=黄, weight=224] 
], 
[ 
Apple [color=红, weight=131], 
Apple [color=绿, weight=153], 
Apple [color=黄, weight=119] 
] 
]

5.总结

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

排序和分组的区别在于: 
排序时,两个对象比较的结果有三种:大于,等于,小于。 
分组时,两个对象比较的结果只有两种:等于(两个对象属于同一组),不等于(两个对象属于不同组)

java中Comparator函数的用法实例? 阅读详情

相关推荐

一文掌握Comparator的数十种用法

一文掌握Comparator的数十种用法,nullsFirst 和 nullsLast 方法,comparing方法的两种形式,Comparator.naturalOrder 和 Comparator.reverseOrder的原理

4万+

JAVA语言-比较器Comparator

Comparator 是javase中的接口,位于java.util包下。数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。List实例调sort方法// 将英文字母先排序好@Override});使用总结:在可以使用 Comparator实例 的地方,new Comparator 然后覆写compare方法即可。

qq_58148854的博客 9790

Nacos漏洞利用工具V3.0.5实战:从认证绕开到内存马植入的全流程指南

本文详细解析了Nacos漏洞利用工具V3.0.5在实战中的应用,从认证绕开到内存马植入的全流程。文章深入探讨了如何利用Nacos的历史漏洞,如默认口令、认证逻辑绕过、Derby SQL注入及Jraft反序列化,实现权限提升与持久化控制,并提供了防御视角与加固建议,旨在帮助安全人员理解攻击链以加强防护。

h6j7k8l9p0的博客 483

【Java 8 新特性】Java Comparator | 比较器

Java Comparator | 比较器比较器功能方法:compare(T o1, T o2)1. 使用 Lambda 表达式定义 compare2. 自定义 compare 实现比较器比较器的使用Stream.sortedCollections.sortList.sortArrays.sort比较器的方法1. reversed2. reverseOrder3. naturalOrder4. nullsFirst5. nullsLast6. comparing7. comparingInt Java ja

猫巳的博客 3万+

Multisim 14.0实战:从零搭建可调幅多波形信号发生器(附仿真文件)

本文详细介绍了如何在Multisim 14.0中从零搭建一个可调幅多波形信号发生器,涵盖方波、三角波和正弦波的生成原理与实现步骤。通过核心电路架构解析、关键参数设计及Multisim实战操作,帮助电子工程学习者和硬件工程师掌握信号发生器的设计与调试技巧,并提供仿真文件供实践验证。

nokia的博客 1073

25年PINN创新点大盘点!

在科研论文的激烈角逐中,想轻松产出高含金量成果?物理信息神经网络(PINN)堪称“宝藏研究方向”,是冲击高分区论文的绝佳赛道!对于渴望发表优质论文的科研伙伴,这三大研究路径值得重点关注。首先是自适应PINN,在PINN训练过程中,物理方程与实测数据间的矛盾常常导致权重调节困难,而恰好直击这一痛点,是极具价值的研究方向。其次,同样前景广阔,传统多物理场同时训练效果欠佳,如今分阶段训练方法脱颖而出,成效显著且竞争较小。最后,探索及多任务学习等技术的融合,能实现优势叠加,碰撞出创新火花。

Malaai的博客 1970

java中的comparator_Java中Comparator的使用

Comparable与Comparator的区别Comparable & Comparator都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法或在集合内实现 Comparable接口的方法,Comparator位于包java....

weixin_42350865的博客 2万+

ESP32+micro-ROS机器人开发实战:轻量级ROS2嵌入式集成

ROS2是现代机器人软件栈的核心框架,其基于DDS的分布式通信与QoS保障能力为多节点协同提供基础支撑;而micro-ROS作为专为微控制器优化的ROS2兼容中间件,解决了资源受限设备(如ESP32)接入ROS2生态的关键难题。其通过分层架构将DDS通信下沉至上位机Agent,使MCU仅需运行轻量Client,大幅降低内存开销(实测<180KB)并保留标准ROS2接口语义。该方案广泛应用于教育机器人、移动底盘、传感器节点等嵌入式场景,尤其适合基于ESP-IDF开发的Wi-Fi/BLE物联网机器人系统。本文以

weixin_29025501的博客 399

java comparator用法_Java Comparator thenComparingLong()用法及代码示例

Java中Comparator接口的thenComparingLong(java.util.function.ToLongFunction)方法将返回字典顺序比较器,该函数具有提取Long排序键的函数。用法:default Comparator thenComparingLong(ToLongFunction keyExtractor)参数:此方法接受keyExtractor,该函数用于提取L...

weixin_26833503的博客 1258

网络安全隔离技术解析:单向网闸与双向网闸的核心差异与应用场景

本文深入解析网络安全隔离技术中的单向网闸与双向网闸,详细比较两者的核心差异与应用场景。单向网闸通过物理隔离确保数据单向流动,适用于金融交易等高风险场景;双向网闸则支持严格安检的双向数据交互,常见于医疗、政务等领域。文章还提供了选型建议和技术发展趋势,帮助读者根据安全需求和业务场景选择最适合的网闸解决方案。

weixin_29323365的博客 527

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

java comparator用法_Java中Comparator接口的用法

/*** 功能:通过对一个整形数组进行排序,来了解Comparator用法** @author wangchangshuai0010 山东科技大学 2013年2月7日 0:05*/package test;import Java.io.BufferedInputStream;import java.util.Arrays;import java.util.Comparator;import jav...

weixin_29767773的博客 253

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 337

Java 中 Comparator 的全方位用法详解

Comparator 接口是 Java 中实现自定义排序的强大工具,从基础的匿名内部类、Lambda 表达式创建,到处理对象属性排序、多条件组合排序、降序排序等常见场景,再结合 Java 8 及以上的新特性(静态工厂方法、thenComparing 、空值处理等 ),以及在各类集合排序中的应用,全方位覆盖了排序需求的不同层面。

wxd0116的博客 2777

用扩展点为 Fiori Elements 添加自定义动作:从原理到落地的完整实践

本文介绍了如何在基于OData V4的Fiori Elements应用中通过Extension Points添加自定义Action按钮。主要内容包括: 扩展点动作与标准注解动作的区别:扩展点用于非标准前端流程、组合操作等场景,需通过extensionAPI与框架交互。 扩展点动作的插入位置:可放置在List Report表格工具栏、Object Page页眉/页脚/Section工具栏等位置,并说明了相应的manifest.json配置节点。 配置模型与处理函数契约:详细说明了press、visible/e

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 249

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java】Comparator接口简单用法

是 Java 中一个重要的接口,用于定义对象的自定义排序规则,尤其在需要对对象集合进行排序时非常实用。它位于 包中,提供灵活的排序方式。 核心方法 常见用法 1.基本排序 对一个对象集合按特定字段排序(下面是升序,注释错了)从 Java 8 开始,可以使用 方法按特定字段排序用的还是上面的Person类使用 方法实现降序排序下面有三种写法实现降序排序第一种需要提供getter方法,还有Lambda简化写法当需要按多个字段排序时,可以使用 如果 相等,则按 排序。 通常与 或 配合

lklalmq的博客 536

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java的Comparator比较器用法总结

Java的Comparator比较器用法总结

weixin_46356409的博客 390

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Java】Comparator 的用法

Comparator 类常作为 sorted() 方法的参数传递给 sorted 方法,用来解决给集合排序,自定义排序规则的问题 。在默认的compare方法中有两个参数o1和o2,Java中默认是升序排序的,就是如果你重写了compare方法的逻辑,它不管你compare方法内部是怎么比较的,返回正整数则认为o1>o2,返回0则认为o1=o2,返回负整数则认为o2>o1,所以他会比较List集合中所有的元素,得到确定大小的结果进行升序排序。

Gzzz的博客 5591

java 基础-Comparable和Comparator的用法

Java中Comparable和Comparator的用法 对于自己定义的数据结构,进行排序时,需要我们给予他一定的排序规则,这就涉及到了Java中的两个常用的接口Comparable<T>和Comparator<T>的实现。 Comparable --内部比较器 public interface Comparable<T> (1) 该接口只有一个int co...

哈哈哈的博客 596

Java 的Comparator比较器用法

1.定义:Comparator是外部比较器,用于比较来对象与对象之间的,两个对象进行比较,多用于集合排序,而Comparable可以认为是一个内比较器,根据对象某一属性进行排序的 2.使用方法 1)定义节点信息 class Node{ int x; int y; Node(int x,int y){ this.x=x; this.y...

苍白的咏叹调的博客 1万+

Java——浅析Comparable与Comparator用法

文章目录Comparable与Comparator用法概述ComparableComparator案例总结共同点不同点 Comparable与Comparator用法 概述 Java中对集合对象或者数组对象排序,有两种方法 对象实现Comparable 接口 定义比较器,实现Comparator接口。 Comparable 1.包括实体类与实现comparable重写ComparaTo方法 写...

云祁QI 1246

Java8 的 Comparator 用法

java1.8 的新的函数式的Comparator 不要太方便了. 可以轻松的实现各种List 的排序, 比以前写什么匿名的内部类, 静态类方便了很多, 很多. //比较器 //按照sort_id 的升序排 //写法1 Comparator<ApplyedPersonVO> c = (a, b) -> a.getSort_id().compareTo(b.getSort_id()); //写法2 Comparator<ApplyedPersonVO> c2=Comp..

长河的博客 2040

java中Comparator接口的用法

/** * 功能:通过对一个整形数组进行排序,来了解Comparator用法 * * @author wangchangshuai0010 山东科技大学 2013年2月7日 0:05 */ package test; import java.io.BufferedInputStream; import java.util.Arrays; import java.util.Compara

忆、瞻的专栏 1万+
上一篇: Java进阶--深入理解ArrayList实现原理
下一篇: 20180321
Coldzerace
博客等级 码龄9年 3粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值