Comparable和Comparator的区别以及Lambda表达式实现

2023-11-16

Comparable和Comparator的区别

1.comparable里面的ComparaTo()是TreeSet和TreeMap里面add()与put()方法里面调用对象的ComparaTo(),通过返回值,来确定它,是否存在or顺序。他是内置的,所以如果自定义对象用TreeSet来存的话,得重写ComparaTo.这里不能,用Lambda表达式,Lambda表达式和匿名内部类一样,就是为了创建对象,而这里不用。

2.Comparator是人工比较器,它的优先级高于Comparable,当系统检测到里面实现了Comparator,它会优先于Comparable使用,它是脱离你所存的对象的,它通过创建自己的对象,定义自己的规则,它的compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int。然后集合调用自己的构造,传进去,在使用add()或put()方法时,自动调用Compare方法。

实例代码1


package com.chd.day06;



import java.util.Comparator;

import java.util.Set;

import java.util.TreeSet;



public class Lambda02 {



    static int compararr(String s1, String s2) {

        return (s1.length() - s2.length()) == 0 ? s1.compareTo(s2) : (s1.length() - s2.length());

    }



    public static void main(String[] args) {

        // TODO Auto-generated method stub

        // 开始

//         ImplementsComparator im = new ImplementsComparator();

        /*匿名内部类

        Comparator im =new Comparator() {



            @Override

            public int compare(Object o1, Object o2) {

                // TODO Auto-generated method stub

                // 向下转型

                String s1 = (String) o1;

                String s2 = (String) o2;

                // 先按照长度比

                int num = s1.length() - s2.length();

                // 长度相同,再按照字典顺序比

                return num == 0 ? s1.compareTo(s2) : num;

            }

            

        };

        */

        // 第一次Lambda:

        /*

         * Comparator im = (s1,s2)->{ String o1 = (String)s1; String o2 = (String)s2;

         * int num = o1.length()-o2.length(); return num==0?o1.compareTo(o2):num; };

         */ 

         //第二次Lambda: 

        

        Comparator<String> im =(s1,s2)->(s1.length()-s2.length())==0?s1.compareTo(s2):(s1.length()-s2.length());

         

        // 第三次Lambda;

//        Comparator<String> im =Lambda02::compararr;

        Set<String> set = new TreeSet<>(im);



        set.add("skdj");

        set.add("skdj");

        set.add("skdj");

        set.add("skdj");



        System.out.println(set);



    }



}



class ImplementsComparator implements Comparator<String> {



//    @Override

//    public int compare(T o1, T o2) {

//        // 比较字符串的长度

//        if (!(o1 instanceof String)) {

//            throw new ClassCastException("类型转换错误");

//        }

//        if (!(o2 instanceof String)) {

//            throw new ClassCastException("类型转换错误");

//        }

//        // 向下转型

//        String s1 = (String) o1;

//        String s2 = (String) o2;

//        // 先按照长度比

//        int num = s1.length() - s2.length();

//        // 长度相同,再按照字典顺序比

//        return num == 0 ? s1.compareTo(s2) : num;

//    }



    @Override

    public int compare(String s1, String s2) {

        // TODO Auto-generated method stub

        return (s1.length()-s2.length())==0?s1.compareTo(s2):(s1.length()-s2.length());

    }



}

实例代码2


package com.chd.day06;



import java.util.Set;

import java.util.TreeSet;



public class Lambda01 {



    public static void main(String[] args) {

        // TODO Auto-generated method stub



        Set<Person> set = new TreeSet<>();

        set.add(new Person("张三",23));

        set.add(new Person("张三",23));

        set.add(new Person("张三",24));

        set.add(new Person("李四",24));

        System.out.println(set);

    }



}

//匿名内部类:是为了创建一个实例:而这里需要的是重写这个方法

//class Person implements Comparable<Person>{

//    public String name;

//    public int age;

//    public Person() {}

//    public Person(String name,int age) {

//        super();

//        this.name=name;this.age=age;

//        

//    }

//    

//    @Override

//    public String toString() {

//        return "Person [name=" + name + ", age=" + age + "]";

//    }

//    Comparable<Person> mi = new Comparable<Person>() {

//

//        @Override

//        public int compareTo(Person person) {

//            // TODO Auto-generated method stub

//            int num = 

//            return num==0?this.age-person.age:num;

//        }

//        

//    };

    

//}

//Lambda表达式01

class Person {

    public String name;

    public int age;

    public Person() {}

    public Person(String name,int age) {

        super();

        this.name=name;this.age=age;

        

    }

    

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }



    Comparable<Person> person=(p)->{    

        int num = this.name.compareTo(p.name);

        return num==0?this.age-p.age:num;

    };

    

    

}



/*加泛型

class Person implements Comparable<Person>{

    public String name;

    public int age;

    public Person() {}

    public Person(String name,int age) {

        super();

        this.name=name;this.age=age;

        

    }

    

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }

    @Override

    public int compareTo( Person person) {    

        int num = this.name.compareTo(person.name);

        return num==0?this.age-person.age:num;

    }

    

}

*/



/*未加泛型

class Person implements Comparable{

    public String name;

    public int age;

    public Person() {}

    public Person(String name,int age) {

        super();

        this.name=name;this.age=age;

        

    }

    

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }

    @Override

    public int compareTo( Object o) {

        if(!(o instanceof Person)) {

            throw new ClassCastException("类型转换错误");

        }

        Person person = (Person) o;

        

        int num = this.name.compareTo(person.name);

        return num==0?this.age-person.age:num;

    }

    

}

*/





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Comparable和Comparator的区别以及Lambda表达式实现 的相关文章

  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • 【华为OD机试】路灯照明问题【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 在一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间间距固定为100米 每个路灯都有自己的照明半径 请计算第一个路灯和最后一个路灯之间 无法照明的区间的长度和
  • 线上git仓库地址更改,本地如何更改?

    1 进入终端查看本地代码关联的git仓库地址 git remote v 2 删除本地关联的git仓库地址 git remote rm origin 3 本地代码关联新的仓库地址 git remote add origin 新地址 4 再次查
  • 获取BDUSS的简单方式

    BDUSS是登录百度 web wap 后的唯一身份凭证 baidu com 受http only保护 拿到BDUSS就等于拿到帐号的控制权 通行贴吧 知道 百科 文库 空间 百度云等百度主要产品 在 贴吧云签系统 中 需要用到BDUSS进行
  • Linux下查看磁盘使用率及文件和文件夹大小

    原文地址 http blog sina com cn s blog 4ab088470106ge0o html 大家在使用linux的过程中 或许遇到过数据无法入库 无法上传数据等等 这就要多长个心眼 去查看一下磁盘使用率和文件大小吧 这时
  • 贪心+二分解决最大值最小、最小值最大问题

    在刷题时 总会遇到求最大值最小 最小值最大问题 也许它会暗喻是这样的一个问题 对于这样的一个问题 你会发现用dp和枚举都会超时超内存 或者说很麻烦 所以这是一个比较简单的解题方式 二分逼近思想 对于难以直接确定解的问题 采取二分枚举 检验的
  • mysql常见六大约束

    DDL语言 常见约束 约束的含义 一种限制 用于限制表中的数据 为了保证表中的数据的准确性和可靠性 分类 六大约束 1 NOT NULL 非空约束 用于保证该字段的值不能为空 比如姓名 学号等 2 DEFAULT 默认约束 用于保证该字段有
  • Pycharm中放大和缩小代码界面

    直接上图流程 打开文件 点击设置 选择 keymap 右侧搜索框输入 increase 搜索出来之后双击 选择 Add Mouse Shortcut 然后在操作框按住 Ctrl 并将鼠标滚轮上滑 完成设置 一直点击OK关闭界面即可 之后按住
  • TortoiseGit如何变动项目Ip地址

    第一步 进到项目所在目录 找到git文件夹里的config文件 第二步 用记事本打开config文件 修改ip地址信息并保存即可
  • Spring的内部bean

    当一个bean仅被用作另一个bean的属性时 才能被声明为一个内部bean 为了定义inner bean 在Spring的基于XML的配置元数据中 可以在
  • 激光炸弹题解

    维生素C吃多了会上火 个人CSDN博文目录 2022蓝桥杯 目录 题目链接 题解 题目链接 题解 1 不同目标可能在同一位置所以 w 2 可能在 5000 5000 所以要算到5001 3 long long 超内存 include
  • EasyPoi实现Excel数据导入

    EasyPoi是一个基于Java的Excel导入导出框架 主要提供了Excel读取 写入等基本功能 并且支持通过注解来定义Excel文件的格式 添加maven依赖
  • 【WinForm】WebView2-个性化浏览器-桌面程序开发详解

    这是一个桌面程序上的浏览器 是用插件WebView2开发的浏览器桌面程序 功能体验堪比Edge浏览器 相比使用Chrome内核插件开发浏览器来说 还是用插件WebView2开发来得简单一些 接下来讲一讲实现过程 开发之前 建议先看看微软的
  • spring boot工程创建(idea无法联网)

    1 进入spring官网Spring Home 2 点击spring boot 3 翻到最下边 点击此处 或者直接进入网址Spring Initializr 4 设定项目基本内容 5 选择对应依赖 6 删除依赖 7 创建项目 8 将项目压缩
  • 自监督学习-MoCo-论文笔记

    论文 Momentum Contrast for Unsupervised Visual Representation Learning CVPR 2020 最佳论文提名 用动量对比学习的方法做无监督的表征学习任务 动量的理解即是指数移动平
  • 初学者写一个程序(一)(PyCharm配置Python解释器)

    5 PyCharm配置Python解释器 1 首先安装 PyCharm 完成之后 打开它会显示如下所示的界面在file中也有settings 点击后一样的操作 图六 在此界面中 可以手动给 PyCharm 设置 Python 解释器 点击图
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • torch.nn.modules.module.ModuleAttributeError: ‘DataParallel‘ object has no attribute ‘step‘

    错误位置定点 解决方法
  • react学习—属性默认值和类型验证

    属性默认值和类型验证 一 属性默认值 1 函数组件属性默认值 2 类组件默认属性值 二 属性类型验证 1 常见值类型 2 是否必传isRequired 3 其它类型验证 4 自定义验证 一 属性默认值 通过一个静态属性defaultProp
  • 基础算法matlab

    常用算法 knn knn clc close all clear training mvnrnd 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 group ones 50
  • Comparable和Comparator的区别以及Lambda表达式实现

    Comparable和Comparator的区别 1 comparable里面的ComparaTo 是TreeSet和TreeMap里面add 与put 方法里面调用对象的ComparaTo 通过返回值 来确定它 是否存在or顺序 他是内置