Java集合Collections和元素排序之Comparable排序接口讲解

news2024/11/15 9:44:45

    Collections工具类: Java里关于集合的工具类,包含有各种有关集合操作的静态多态方法,不能实例化(把构造函数私有化) 。


    和Collection的区别 : Collection是接口,提供了对集合对象进行基本操作的通用接口方法,List、Set等多种具体的实现类。Collections是工具类,专门操作Collection接口实现类里面的元素。
    常用方法: 排序 sort(List list)
   按自然排序的升序排序

    可见, 默认排序后是按字母升序输出。

在这里插入图片描述



package Demo_1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortTest {
    public static void main(String[] args) {
        sortTest();
    }
    public static void sortTest() {
      List<String> list = new ArrayList<>();
      list.add("aaa");
      list.add("yyy");
      list.add("mmm");
      list.add("ddd");
      System.out.println("排序前:" + " " + list);
      Collections.sort(list);
      System.out.println("排序后:" + " " + list);


    当数组里包括大小写,排序输出结果为先排大写,再排小写。

在这里插入图片描述



package Demo_1;


public class SortTest {
    public static void main(String[] args) {
        sortTest();
    }
    public static void sortTest() {
      List<String> list = new ArrayList<>();
      list.add("AAA");
      list.add("yyy");
      list.add("MMM");
      list.add("ddd");
      System.out.println("排序前:" + " " + list);
      Collections.sort(list);
      System.out.println("排序后:" + " " + list);


    默认是升序,等于Collections.sort(list), Collections.sort(list, Comparator.naturalOrder())
    降序: Collections.sort(list,Comparator.reverseOrder());

在这里插入图片描述



//默认升序
       Collections.sort(list, Comparator.naturalOrder());
       System.out.println("默认升序:" + " " + list);

 //降序
       Collections.sort(list, Comparator.reverseOrder());
      System.out.println("降序:" + " " + list);


    随机排序 shuffle(List list): 可见输出排序顺序是随机的。

在这里插入图片描述



//随机排序
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        list.add("8");
        list.add("9");
        list.add("10");
        list.add("M");
        list.add("P");
        list.add("A");
        System.out.println(list);
        Collections.shuffle(list);
        System.out.println(list);


    获取最大元素 max(Collection coll, Comparator comparator) 其中 Comparator 是传入一个对象。以下用一个日常订单例子,讲解它的用法。

    创建一个 Customer 类,创建它的 get/set 方法



在这里插入图片描述
在这里插入图片描述



public class CollectionsTest {

    public static void main(String [] args){

    }
}

class Customer{

    private String name;

    private int order;

    public Customer(String name,int order){
        this.name = name;
        this.order = order;
    }

    public String getName() {
        return name;
    }

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

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

}


    创建一个 List 对象



在这里插入图片描述



    public static void main(String [] args){

        List<Customer> list = new ArrayList<>();
        list.add(new Customer("陈小姐",25));
        list.add(new Customer("王先生",30));
        list.add(new Customer("黄小姐",33));
        list.add(new Customer("伍小姐",18));
        list.add(new Customer("李先生",42));
        System.out.println(list);

    }


    打印这个 list,结果为一堆内存地址而已。



在这里插入图片描述



    我们可以通过添加调试方法,去获取详细的订单信息。



在这里插入图片描述



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


    通过调用 toString() 方法,可以生成每个客户的订单信息。



在这里插入图片描述



    获取 Max 值:创建 new Comparator() ,Comparator其实就是一个接口,通过底层代码可知,o1 - o2 是升序,当 o1 - o2 > 0, 证明 o1 > o2,就一直往上排,谁大谁排最上,因此结果为最大值的42


   



在这里插入图片描述



在这里插入图片描述



    相反,要获取最小值,o2 - o1 是降序,当 o2 - o1 < 0, 证明 o2 < o1,就一直往下排,谁细谁排最下。得出最小值为 18



在这里插入图片描述



    另外一种自定义写法,例如再创建多一个 CustomerComparator 类,实现 Comparator 接口。



在这里插入图片描述



package Demo_2;

import java.util.Comparator;

public class CustomerComparator implements Comparator<CollectionsTest.Customer> {

    @Override
    public int compare(CollectionsTest.Customer o1, CollectionsTest.Customer o2) {
        return o1.getOrder()-o2.getOrder();
    }
}


    同样调用 Collections.max,传入新建的 StudentComparator 对象。





   创建不可变集合unmodifiablleXXX() , 其中 XXX 为对象集合。



在这里插入图片描述



    当添加新的产品时,会出现报错。



在这里插入图片描述



    同样,也可以创建 Set、Map



在这里插入图片描述



    再添加内容后,同样也有报错。



在这里插入图片描述



    最后,再介绍 Comparable,它是一个接口,定制排序规则。对实现它的每个类的对象进行整体排序,里面 compareTo 方法是实现排序的具体方法,例如TreeSet、SortedSet、Collections.sort() 方法调用进行排序。String、Integer等类默认实现了这个接口,所以可以排序。



public interface Comparable<T> {
 public int compareTo(T o);
}


    compareTo方法,用于比较次对象和指定对象的顺序,o为要比较的对象,返回int类型。


    大于0, 表示this大于传进来的对象o ,则往后排,即升序
    等于0,表示this等于传进来的对象o
    小于0,表示this小于传进来的对象o



    创建一个 TreeSet 容器对象,添加以上同样的客户订单信息。



在这里插入图片描述



    同样,创建 Customer 类,并实现Comparable接口



在这里插入图片描述



    覆写 compareTo() 的方法,把 Customer 强转,返回 this.order - customer.order, 表示为升序,其中 this 就是当前的元素,例如当前是 set 里面的第1个,则 this就是第1个,如此类推。



在这里插入图片描述



  @Override
    public int compareTo(Object o) {
        Customer customer = (Customer)o;
        return this.order - customer.order;
    }


    另外一种相对标准的覆写写法, 通过 instanceof 条件去判断。作用是判断一个类是否实现了某个接口,或者判断一个实例对象是否属于一个类。但出现 " Missing return statement" 这样的一个报错。



在这里插入图片描述



    compareTo() 方法,其实它默认的是 return 0, 意思是当返回的数是0时,对比的两个对象是相同的。



在这里插入图片描述



@Override
    public int compareTo(Object o) {
//        Customer customer = (Customer) o;
//        return this.order - customer.order;
        if (o instanceof Customer) {
            Customer customer = (Customer) o;
            return this.order - customer.order;

        }
        return 0;
    }


    同理,如果要实现降序,只需要改为 customer.order - this.order 就可以。



在这里插入图片描述



    @Override
    public int compareTo(Object o) {
//        Customer customer = (Customer) o;
//        return this.order - customer.order;
        if (o instanceof Customer) {
            Customer customer = (Customer) o;
//            return this.order - customer.order;
            return customer.order - this.order;

        }
        return 0;
    }


    综合这一期和上一期介绍的 Python 和 Javascript 的排序,大家可以发现虽然 Java 的写法好像相对比较复杂,但其实都有部分原理基本一样的。在不同的场景各有各的应用优点。下一期将继续通过另外一个日常项目去详解 Collections 的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能网卡相关知识(smart nic 、DPU)

网卡作为穿行在网络与计算之间的桥梁&#xff0c;是可以解决计算瓶颈的关键硬件。 随着CPU 密度和数据中心网络带宽的进一步提升&#xff0c;用户对预期性能的需求&#xff0c;系统运行平稳性都会有更高的要求。云厂商一方面面临巨大的成本压力&#xff0c;另一方面面临巨大的…

动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

&#x1f38a;【数据结构与算法】专题正在持续更新中&#xff0c;各种数据结构的创建原理与运用✨&#xff0c;经典算法的解析✨都在这儿&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 -…

28 · 搜索二维矩阵

LintCode 炼码 class Solution { public:/*** param matrix: matrix, a list of lists of integers* param target: An integer* return: a boolean, indicate whether matrix contains target*/bool searchMatrix(vector<vector<int>> &matrix, int target) …

AI制药 - AlphaFold DB PDB 数据集的多维度分析与整理 (2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130118339 数据集&#xff1a;AlphaFold Protein Structure Database 下载地址&#xff1a;https://alphafold.ebi.ac.uk/download Alp…

springboot 部署k8s(二)

系列文章目录 目录 系列文章目录 前言 操作步骤 1.springboot.yaml文件 2.查看deployment 3.查看service服务 4.验证服务 总结 前言 springboot 部署到k8s 上。里面涉及了deployment, Service, NodePort. 操作步骤 1.springboot.yaml文件 apiVersion: apps/v1 kind: …

【C++】C/C++内存管理:

本篇的内存管理主要是动态内存管理。 1.C中的malloc、realloc、calloc和free函数&#xff1a; 【面试问题】 malloc、calloc和realloc的区别是什么&#xff1f; malloc申请的内存值是不确定的 calloc却在申请后&#xff0c;对空间逐一进行初始化&#xff0c;并设置值为0 异…

MATLAB基于卡尔曼滤波的锂蓄电池SOC设计matlab仿真代码(链接在文章结尾)

用自适应卡尔曼滤波方法&#xff0c;基于锂离子动力电池等效电路模型&#xff0c;在未知干扰噪声环境下&#xff0c;在线估计电动汽车锂离子动力电池荷电状态&#xff08;SOC&#xff09;。 相比于其它电池模型&#xff0c;等效电路模型可以更直观地表现输入与输出&#xff0c;…

01-Android 序列化与反序列化

1. 背景 在日常开发过程中&#xff0c;经常遇到程序读取文件&#xff0c;将文件数据转换为对象&#xff0c;程序通过对象传输数据&#xff0c;或者通过对象读取数据。同时也会经常遇到对象数据写入文件操作。 如果采用常规的文件读写&#xff0c;然后再进行赋值&#xff1b;那…

每日学术速递4.16

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.SpectFormer: Frequency and Attention is what you need in a Vision Transformer 标题&#xff1a;SpectFormer&#xff1a;频率和注意力是您在 Vision Transformer 中所需要的 …

医院不良事件报告系统源码:基于PHP+vue2+element+laravel8技术开发

医院不良事件报告系统源码 文末获取联系&#xff01; 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c; 开发语言&#xff1a;PHP 开发工具&#xff1a;vscode 前端框架&#xff1a;vue2element 后端框架&#xff1a;laravel8 数 据 库&#xff1a;mysql5…

一文读懂Java类加载全过程,面试必备!

1、概述 Java类加载过程是Java虚拟机&#xff08;JVM&#xff09;将.class文件中的字节码装载到内存中&#xff0c;并对字节码进行验证、准备和初始化的过程。这个过程涉及到了Java虚拟机的类加载器、运行时数据区等多个方面&#xff0c;其中包含了很多的细节和技术问题。 类加…

前端开发神器bootstrap介绍

想必刚开始学习前端的小伙伴在为设计优美的前端页面很苦恼吧&#xff0c;心中有好的比较不错的UI样式却无法绘制出来&#xff0c;学习呢又可能会有点困难&#xff0c;其实前端是很容易并不难学的&#xff0c;在前端设计上也有很多的开源库的&#xff0c;这些第三方的开源库已经…

12、视图解析器与模板引擎

文章目录1、视图解析1.1 spring boot支持的第三方模板引擎技术1.2、视图解析原理流程2、模板引擎-Thymeleaf2.1、thymeleaf简介2.2、基本语法1、表达式2、字面量3、文本操作4、数学运算5、布尔运算6、比较运算7、条件运算8、特殊操作2.3、设置属性值-th:attr2.4、迭代2.5、条件…

【数据结构】顺序表(上)

所属专栏&#xff1a;初始数据结构 博主首页&#xff1a;初阳785 代码托管&#xff1a;chuyang785> 感谢大家的支持&#xff0c;您的点赞和关注是对我最大的支持&#xff01;&#xff01;&#xff01; 博主也会更加的努力&#xff0c;创作出更优质的博文&#xff01;&#x…

(十六)排序算法-桶排序

1 基本介绍 1.1 概述 桶排序 &#xff08;Bucket sort&#xff09;或所谓的箱排序&#xff0c;是一个排序算法&#xff0c;工作的原理是将数组分到有限数量的桶里。每个桶再个别排序&#xff08;有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序&#xff09;&a…

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

碎碎念&#xff1a;好久不见&#xff0c;甚是想念&#xff01;本期带来的是有关ZYNQ7020的内容&#xff0c;我们知道ZYNQ作为一款具有硬核的SOC&#xff0c;PS端很强大&#xff0c;可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器&#xff0c;之后发布的Part…

Java-初识 .class 文件

一、概述 class文件全名称为 Java class 文件&#xff0c;主要在平台无关性和网络移动性方面使 Java 更适合网络。该文件打破了 C 或者 C 等语言所遵循的传统&#xff0c;使用这些传统语言写的程序通常首先被编译&#xff0c;然后被连接成单独的、专门支持特定硬件平台和操作系…

面试被问到vue的diff算法原理,我不允许你回答不上来

一、是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点&#xff1a; 比较只会在同层级进行, 不会跨层级比较在diff比较的过程中&#xff0c;循环从两边向中间比较 diff 算法在很多场景下都有应用&#xff0c;在 vue 中&#xff0c;作用于虚拟 dom 渲…

nvm实现多版本node自由切换

nvm&#xff0c;全称是node.js version management,可以在多个node版本之间自由切换&#xff01; 1、下载文件 github Releases coreybutler/nvm-windows GitHub 2、安装nvm 注意&#xff1a;安装前必须完全卸载node 彻底从Windows中删除Node.js 1、从卸载程序卸载程序和功…

【性能测试】Jemeter+mysql+CSV+InfluxDB+Granafa数据库性能测试及监控

Jmeter连接Mysql并执行事务 一、下载驱动并加入jmeter 1.mysql驱动下载地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载(版本一定要对应) 2.下载后&#xff0c;解压&#xff0c;找到驱动jar包复制到桌面&#xff1a; 3.把驱动j…