Java学习-Comparable和Comparator

  • Comparable和Comparator都是来做排序
Comparable自然排序
  • 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
  • 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
package com.lotus.java;

/**
 * Administrator
 * 商品类
 */
public class Product implements Comparable {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Product() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    /**
     * 按照价格从低到高进行排序
     * 返回值是正数,当前对象大
     * 返回值是负数,当前对你小
     * 返回值是0,一样大
     * @param o
     * @return
     */
    /*@Override
    public int compareTo(Object o) {
        if (o == this) {
            return 0;
        }
        if (o instanceof Product) {
            Product product = (Product)o;
            int compare = Double.compare(this.price, product.price);
            return compare;
        }
        //手动抛出一个异常
        throw new RuntimeException("类型不匹配");
    }*/

    /**
     * 比较标准,先比较价格,价格相同,进行名字比较
     * @param o
     * @return
     */
    @Override
    public int compareTo(Object o) {
        if (o == this) {
            return 0;
        }
        if (o instanceof Product) {
            Product product = (Product)o;
            int compare = Double.compare(this.price, product.price);
            if (compare != 0) {
                return compare;
            }
            return this.name.compareTo(product.name);

        }
        //手动抛出一个异常
        throw new RuntimeException("类型不匹配");
    }
}
public class ComparableTest {

    @Test
    public void test1() {
        String[] arr = new String[]{"Water","Dizzy","Edison","Tye","Lucy"};
        Arrays.sort(arr);
        for (String s : arr) {
            System.out.println(s);
        }
    }
    @Test
    public void test2() {
        Product[] arr = new Product[5];
        arr[0] = new Product("HuaweiMate50pro",6299);
        arr[1] = new Product("XiaoMi13pro",4999);
        arr[2] = new Product("Iphone14pro",8999);
        arr[3] = new Product("VivoX90pro",5999);
        arr[4] = new Product("HonorMagic4",6299);

        Arrays.sort(arr);
        for (Product product : arr) {
            System.out.println(product);
        }
    }
}

Comparator定制排序
  • 强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序
  • 创建自定义比较器类:创建一个类实现 Comparator 接口,并实现 compare() 方法。在该方法中,根据自定义的比较逻辑返回两个对象的大小关系。
  • 使用 Collections.sort() 方法:通过传入一个 List 对象和一个自定义比较器对象,可以按照自定义规则对 List 中的元素进行排序。
  • 使用 Arrays.sort() 方法:类似地,通过传入一个数组和一个自定义比较器对象,可以对数组中的元素进行排序。
 @Test
    public void test1() {
        Product[] arr = new Product[5];
        arr[0] = new Product("HuaweiMate50pro",6299);
        arr[1] = new Product("XiaoMi13pro",4999);
        arr[2] = new Product("Iphone14pro",8999);
        arr[3] = new Product("VivoX90pro",5999);
        arr[4] = new Product("HonorMagic4",6299);
		//使用Comparator匿名内部类方式实现排序
        Arrays.sort(arr, new Comparator<Product>() {
            /**
             *  如何判断两个对象o1,o2的大小,其标准就是此方法的方法体编写的逻辑
             */

            @Override
            public int compare(Product o1, Product o2) {
                int value = Double.compare(o1.getPrice(), o2.getPrice());
                if (value == 0) {
                    return o1.getName().compareTo(o2.getName());
                }
                return -value;
            }
        });
        for (Product product : arr) {
            System.out.println(product);
        }
    }
对比两种排序

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/701122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(学习笔记)数据基建-数据安全

&#xff08;学习笔记&#xff09;数据基建-数据安全 数据安全数据安全实施难点数据安全保障流程数据安全措施实施阶段数据安全如何量化产出数据安全思考 数据安全 数据安全问题是最近比较热的话题&#xff0c;数据泄漏引发的用户信任危机事件也比比皆是&#xff0c;以及跨部门…

ThinkBook 16 2024 Ubuntu 触控板问题解决

sudo insmod goodix-gt7868q.ko sudo cp local-overrides.quirks /etc/libinput/local-overrides.quirks sudo systemctl restart gdm 有偿解决&#xff0c;无效退款

PostgreSQL17新特性之分区拆分与合并

PostgreSQL 17 带来了许多新特性和改进&#xff0c;其中之一就是对分区拆分与合并的支持。这些特性使得管理大规模数据库中的数据变得更加灵活和高效。 分区拆分 分区拆分&#xff08;Partition Split&#xff09;允许你将一个现有的分区分成多个子分区。这在需要将已有的大分…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第38课-密室逃脱-3D互动剧情

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第38课-密室逃脱 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

数字雕刻技术在AI绘画中的革新作用

随着人工智能技术的不断进步&#xff0c;AI在艺术领域的应用也日益广泛&#xff0c;尤其是在绘画领域。数字雕刻技术作为一种先进的图形处理方式&#xff0c;其在AI绘画中的作用不可小觑。本文将深入探讨数字雕刻技术如何推动AI绘画的发展&#xff0c;并展示这一技术在艺术创作…

vue+element el-select动态加减框数量及验证下拉框选项动态置灰(选中行的下拉框换个值后,原值没办法监控这个问题也解决了)

1效果: 2部分主要(HTML): 1:这个位置主要就是看看方法什么的吧,还有大概的结构 2:change"sort_Change(item,tablelists.orderbyList)这两个参数(都有大用): (1)item:代表每次你操作的这个数据 (2)tablelists.orderbyList:代表你这一共有几行数据(上边这个例子就会得到一个…

kettle学习(利用jsonPath定位,json文件转换)

kettle学习&#xff08;利用jsonPath定位&#xff0c;json文件转换&#xff09; 于数据处理的广袤天地间&#xff0c;我们时常需应对各类繁杂状况与各式格式。Kettle 作为极具威力的数据集成利器&#xff0c;赋予了我们诸多功能与无限可能此次博客里&#xff0c;我们将重点投向…

【介绍下Pandas,什么是Pandas?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【验收支撑文档】软件验收计划书

软件系统验收计划书是确保新开发的软件系统符合预期要求并稳定运行的关键步骤。本计划书概述了验收过程的主要环节&#xff0c;包括系统功能的详细测试、性能评估、用户接受度测试以及文档完整性的核查。验收团队将依据项目需求规格说明书和合同要求&#xff0c;对系统进行全面…

Java课程设计:基于Java+Swing+MySQL的图书管理系统(内附源码)

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 图书管理系统是一个常见的软件项目,广泛应用于图书馆、学校、企业等需要管理图书资源的场景。该系统通常涵盖图书信息录入、查询、借阅、归还等核心功能,是实现图书资源高效管理的重要工具。 随着信…

linux系统安装anaconda,并通过java程序调用python程序

虚拟环境准备 首先准备一块空的分区&#xff0c;安装anaconda至少要20g以上才能执行简单程序&#xff0c;这里准备20G的磁盘空间 创建分区,执行以下步骤&#xff0c;之后执行reboot重启 fdisk /dev/sda p n 回车 回车 w查看当前系统创建的分区&#xff0c;我这里是名为sda3的…

JWT攻击手册(非常详细)零基础入门到精通,收藏这一篇就够了

JSON Web Token&#xff08;JWT&#xff09;对于渗透测试人员而言可能是一种非常吸引人的攻击途径&#xff0c;因为它们不仅是让你获得无限访问权限的关键&#xff0c;而且还被视为隐藏了通往以下特权的途径&#xff1a;特权升级&#xff0c;信息泄露&#xff0c;SQLi&#xff…

Pytorch 实现简单的 线性回归 算法

Pytorch实现简单的线性回归算法 简单 tensor的运算 Pytorch涉及的基本数据类型是tensor&#xff08;张量&#xff09;和Autograd&#xff08;自动微分变量&#xff09; import torch x torch.rand(5, 3) #产生一个5*3的tensor&#xff0c;在 [0,1) 之间随机取值 y torch.o…

按位拆分+前缀和,CF 1879D - Sum of XOR Functions

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1879D - Sum of XOR Functions 二、解题报告 1、思路分析 朴素暴力O(N^2)&#xff0c;考虑优化 由于要求的是异或值乘长度&#xff0c;那么我们可以按位考虑每一位异或值的贡献 我们枚举每一位 每次遍历…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第六周) - 预训练模型

预训练模型 1. 预训练模型介绍 1.1. ELMo1.2. GPT1.3. BERT 2. Seq2Seq 2.1. T52.2. BART 3. Tokenization 1. 预训练模型介绍 在预训练语言模型出现之前&#xff0c;统计语言模型&#xff08;如N-gram模型&#xff09;是主流方法。这些模型利用统计方法来预测文本中的下一个…

JVM 常量池汇总

Tips JVM常量池分为静态常量池和运行时常量池&#xff0c;因为Jdk1.7后字符串常量池从运行时常量池存储位置剥离&#xff0c;故很多博客也是区分开来&#xff0c;存储位置和内容注意区别&#xff01; 字符串常量池底层是由C实现&#xff0c;是一个类似于HashTable的数据结构&am…

【Linux】运维小脚本:登录即自动显示系统信息

作为Linux运维工程师&#xff0c;我们经常需要快速掌握系统的状态&#xff0c;包括内存使用、CPU负载等关键信息。手动检查这些信息不仅繁琐&#xff0c;而且效率低下。今天&#xff0c;我要给大家介绍一个实用的小技巧&#xff0c;通过一个简单的脚本&#xff0c;每次登录Linu…

基于振弦采集仪的高层建筑结构安全监测技术研究

基于振弦采集仪的高层建筑结构安全监测技术研究 高层建筑的结构安全监测一直是建筑工程领域的重要课题&#xff0c;振弦采集仪作为一种新兴的监测技术&#xff0c;为解决这一问题提供了有力的工具。本文将从振弦采集仪的原理、应用场景以及优势等方面探讨其在高层建筑结构安全…

Windows 如何查看内核数量?这三种方法都可以查看

任务管理器查看 第一种方法是利用任务管理器来查看 CPU 的内核数量&#xff0c;我们可以使用搜索栏输入任务管理器直接打开&#xff0c;或者在使用快捷键“WinX”打开选项框&#xff0c;选择任务管理器。 然后点击性能模块。 在性能界面&#xff0c;我们点击 CPU 模块&#xf…

在ComfyUI中用LoRA换脸,实现超高相似度

准备工作 首先&#xff0c;确保您拥有一个已经训练好的LoRA。如果你不知道如何训练LoRA&#xff0c;可以看看我之前的文章。 这个LoRA可以仅使用被训练人物的大头照。我们的目标是使用LoRA生成与被训练人物高度相似的脸部&#xff0c;然后将其换到任何身体上&#xff0c;实现…