Java 基础进阶篇(十二)—— Arrays 与 Collections 工具类

news2024/11/16 23:31:56

文章目录

  • 一、Arrays工具类
    • 1.1 Arrays 类常用方法
    • 1.2 对于 Comparator 比较器的支持
    • 1.3 Arrays 的综合应用
      • 1.3.1 应用一:数组的降序排序
      • 1.3.2 应用二:根据学生年龄进行排序
  • 二、Collections工具类
    • 2.1 Collections 类常用方法
    • 2.2 Collections 排序相关 API
    • 2.3 Collections 的综合应用
      • 2.3.1 应用一:类自定义比较规则
      • 2.3.2 应用二:匿名内部类方式


一、Arrays工具类

Arrays工具类是数组操作工具类,专门用于操作数组元素的。

1.1 Arrays 类常用方法

在这里插入图片描述

举例:

public static void main(String[] args) {
	int[] arr = {10, 2, 55, 23, 24, 100};
	System.out.println(arr); // [I@4eec7777
	
	// 1、返回数组内容的 toString(数组)
	//String rs = Arrays.toString(arr);
	//System.out.println(rs);
	System.out.println(Arrays.toString(arr)); // [10, 2, 55, 23, 24, 100]
	
	// 2、排序的API(默认自动对数组元素进行升序排序)
	Arrays.sort(arr);
	System.out.println(Arrays.toString(arr)); // [2, 10, 23, 24, 55, 100]
	
	// 3、二分搜索技术(前提数组必须排好序才支持,否则出bug)
	int index = Arrays.binarySearch(arr, 55);
	System.out.println(index); // 4
	
	// 返回不存在元素的规律:“-(应该插入的位置索引 + 1)” 
	int index2 = Arrays.binarySearch(arr, 22);
	System.out.println(index2); // -3
	
	// 注意:数组如果没有排好序,可能会找不到存在的元素,从而出现bug!!
	int[] arr2 = {12, 36, 34, 25 , 13,  24,  234, 100};
	System.out.println(Arrays.binarySearch(arr2 , 36));
}

注:sort() 方法默认对数组进行升序排序


1.2 对于 Comparator 比较器的支持

自定义排序规则:通过设置 Comparator 接口对应的比较器对象,来定制比较规则。

在这里插入图片描述
注:参数比较器对象是一个函数式接口,因此有两种方案:一种是匿名内部类的形式,另一种是比较类实现该接口的方法

如果认为左边数据 大于 右边数据,返回正整数。
如果认为左边数据 小于 右边数据,返回负整数。
如果认为左边数据 等于 右边数据 返回0。


1.3 Arrays 的综合应用

1.3.1 应用一:数组的降序排序

方式一:匿名内部类

public class Test2 {
    public static void main(String[] args) {
        // 定义数组
        Integer[] ages = {34, 12, 42, 23};

        // 匿名内部类
        Arrays.sort(ages, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
            	// 指定比较规则:
                //if(o1 > o2){
                //    return 1;
                //}else if(o1 < o2){
                //    return -1;
                //}
                //return o1 - o2; // 默认升序
                return o2 - o1; //  降序
            }
        });
        // 简化形式 1
        Arrays.sort(ages, (Integer o1, Integer o2) ->{
            return o2 - o1;
        });
        // 简化形式 2
        Arrays.sort(ages, (o1, o2) ->{
            return o2 - o1;
        });

        // 简化形式 3
        Arrays.sort(ages, (o1, o2) -> o2 - o1 );
    }
}

方式二:子类实现

public class Test2 {
    public static void main(String[] args) {
        Integer[] ages = {34, 12, 42, 23};
        Arrays.sort(ages, new Comp());
        System.out.println(Arrays.toString(ages)); // [42, 34, 23, 12]
    }
}
class Comp implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2-o1;
    }
}

1.3.2 应用二:根据学生年龄进行排序

public class Student {
    private String name;
    private int age;
    private double height;

   	// set 和 get 方法省略
}

方式一:匿名内部类

public class ArraysDemo2 {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("吴磊",23 , 175.5);
        students[1] = new Student("谢鑫",18 , 185.5);
        students[2] = new Student("王亮",20 , 195.5);

        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 自己指定比较规则
                // return o1.getAge() - o2.getAge(); // 按照年龄升序排序!
                // return o2.getAge() - o1.getAge(); // 按照年龄降序排序!

                // return (int)o2.getAge() - o1.getAge(); // 不要这样写,因为 (int)(170.5-170.9) = 0
                
                // return Double.compare(o1.getHeight(), o2.getHeight()); // 比较浮点型可以这样写 升序
                return Double.compare(o2.getHeight(), o1.getHeight()); // 比较浮点型可以这样写  降序
            }
        });
        System.out.println(Arrays.toString(students)); // 王亮...、谢鑫...、吴磊...
        
		// Lambda 化简
		Arrays.sort(students, ( o1,  o2) -> Double.compare(o2.getHeight(), o1.getHeight()) );
    }
}

方式二:子类实现

public class ArraysDemo2 {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("吴磊",23 , 175.5);
        students[1] = new Student("谢鑫",18 , 185.5);
        students[2] = new Student("王亮",20 , 195.5);

        Arrays.sort(students, new ComImp());
        System.out.println(Arrays.toString(students));
    }
}

class ComImp implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return Double.compare(o2.getHeight(), o1.getHeight()); // 王亮...、谢鑫...、吴磊...
    }
}

二、Collections工具类

Collections 工具类并不属于集合,其是集合操作工具类,是专门用于操作 Collection 系列集合元素的。

2.1 Collections 类常用方法

在这里插入图片描述


2.2 Collections 排序相关 API

排序方式 1:
在这里插入图片描述
注:本方式不可以直接对自定义类型的 List 集合排序,除非自定义类型实现了比较规则 Comparable 接口。

排序方式 2:
在这里插入图片描述

注:Collections 自定义排序功能指针对 list 集合,相同元素会保留。(set集合、map集合自带自定义排序)

举例:

public static void main(String[] args) {
	List<String> names = new ArrayList<>();
	// 1. 批量添加
	Collections.addAll(names, "楚留香", "橙留香", "陆小凤");
	System.out.println(names); //[楚留香, 橙留香, 陆小凤]
	
	// 2. 打乱顺序
	Collections.shuffle(names);
	System.out.println(names);
	
	// 3. public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
	List<Integer> list = new ArrayList<>();
	Collections.addAll(list, 1,21,13,24);
	Collections.sort(list);
	System.out.println(list); // [1, 13, 21, 24]
}

2.3 Collections 的综合应用

2.3.1 应用一:类自定义比较规则

Apple 类:省略 set 和 get 方法。

public class Apple implements Comparable<Apple>{
    private String name;
    private String color;
    private double price;
    private int weight;

    /**
      方式一:类自定义比较规则
      o1.compareTo(o2)
     */
    @Override
    public int compareTo(Apple o) {
        // 按照重量进行比较的
        return this.weight - o.weight ; // 升序,List 集存储相同大小的元素会保留!
    }
}

2.3.2 应用二:匿名内部类方式

public class CollectionsDemo02 {
	public static void main(String[] args) {
		List<Apple> apples = new ArrayList<>(); // 可以重复!
		apples.add(new Apple("红富士", "红色", 9.9, 500));
		apples.add(new Apple("青苹果", "绿色", 15.9, 300));
		apples.add(new Apple("绿苹果", "青色", 29.9, 400));
		apples.add(new Apple("黄苹果", "黄色", 9.8, 500));
		
		
		// 方式二:sort方法自带比较器对象
		Collections.sort(apples, new Comparator<Apple>() {
			@Override
			public int compare(Apple o1, Apple o2) {
				return Double.compare(o1.getPrice() , o2.getPrice()); // 按照价格排序,价格相同会保留!!
			}
		});
		System.out.println(apples);
		
		// Lambda 方式化简
		Collections.sort(apples, ( o1,  o2) ->  Double.compare(o1.getPrice() , o2.getPrice()) );	
	}
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

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

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

相关文章

哈希表相关知识总结

一、哈希表的定义 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置…

C++相比于C语言增加的8个特性(详解)

C相比于C语言增加的8个特性&#xff08;详解&#xff09; 文章目录 C相比于C语言增加的8个特性&#xff08;详解&#xff09;一、命名空间二、C输入和输出三、缺省参数四、函数重载五、引用六、内联函数七、auto关键字八、指针空值nullptr总结 一、命名空间 c的命名空间是为了…

【刷题之路】LeetCode 21. 合并两个有序链表

【刷题之路】LeetCode 21. 合并两个有序链表 1、题目描述二、解题1、方法1——直接合并1.1、思路分析1.2、代码实现 2、方法2——递归2.1、思路分析2.2、代码实现 1、题目描述 原题连接&#xff1a; 21. 合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 …

Camtasia Studio2023Mac最新电脑版屏幕录像软件

Camtasia Studio2023提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等。它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动的轨迹&#xff0c;解说声音等等&#xff0c;另外&#xff0c;它还具有及时播放和编辑压缩…

数字化转型导师坚鹏:美的集团数字化转型案例研究

美的集团数字化转型案例研究 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不清楚企业数字化转型能否成功&#xff1f; 不知道其它企业数字化转型的实际做法&#xff1f; 不知道其它企业的数字化转型战略是如何演变的&#xff1f; 课程特色&#xff1a; 用…

汽车架构-工作流程 以及相关协议解读

全车架构&#xff08;E/E&#xff09; 车载测试阶段&#xff1a; 台架测试 HIL测试&#xff08;硬件在环测试&#xff09; ADAS智能辅助驾驶测试 OTA测试&#xff08;远程升级测试&#xff09; 测试工具&#xff1a; Can协议工具&#xff1a;Canoe Pcan Zcanpro 辅助工具…

【Stable Diffusion】ControlNet基本教程(三)

接上篇【Stable Diffusion】ControlNet基本教程&#xff08;二&#xff09;&#xff0c;本篇再介绍两个ControlNet常见的基本用法&#xff0c;更多用法欢迎关注博主&#xff0c;博主还会更新更多有趣的内容。 3.3更换物体皮肤 有时&#xff0c;我们不想改变物体的轮廓&#xff…

毫米波雷达系列 | 传统CFAR检测(均值类)

毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09; 文章目录 毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09;1.CA-CFAR算法2.SO-CFRA算法3.GO-CFAR算法4.仿真对比 CFAR检测器主要用于检测背景杂波环境中的雷达目标&#xff0c;常见的均值类CFAR检测…

数据结构之队列的详解

文章目录 一.什么是队列二.队列的使用2.1 队列的基本操作2.2 队列的基本使用 三.队列的模拟实现3.1 数组实现队列3.2 链表实现队列 四.队列的应用4.1 设计循环队列4.2 设计双端队列4.3 队列实现栈4.4 栈实现队列 五.总结 一.什么是队列 队列是一种先入先出(FIFO)的线性表数据结…

点评项目导入

文章目录 开篇导读项目地址导入SQL项目架构介绍后端项目导入前端项目导入 开篇导读 实战篇我们要学习以下内容 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&…

力扣刷题Day12

239. 滑动窗口最大值 (此题逻辑真心牛皮&#xff09; 做此题之前&#xff0c;首先明确此题的目的。我最开始没搞明白此题目的&#xff0c;看代码的时候卡死。 copy他人代码&#xff1a; from collections import dequeclass MyQueue: #单调队列&#xff08;从大到小def __ini…

6.S081——陷阱部分(一文读懂Xv6系统调用)——xv6源码完全解析系列(5)

0.briefly speaking 这篇博客将要开始尝试阅读和研究与Xv6陷阱机制相关的代码&#xff0c;主要有以下文件&#xff0c;最重要的是结合Xv6 book将Xv6处理陷阱的相关逻辑和流程弄透。在Xv6的语境中所谓陷阱的触发有以下三种情况&#xff1a; 系统调用严重错误&#xff08;比如除…

windows守护进程工具--nssm使用

一、nssm简介 nssm是一个服务封装程序&#xff0c;它可以将普通exe程序封装成服务&#xff0c;实现开机自启动&#xff0c;同类型的工具还有微软自己的srvany&#xff0c;不过nssm更加简单易用&#xff0c;并且功能强大。 它的特点如下&#xff1a; 支持普通exe程序(控制台程序…

每天看一个fortran文件(7)之寻找cesm边界层高度计算代码

自从我把我的代码移到了单独的F90 中&#xff0c;从tphysac.F90中调用后。我发现有很多的变量我没办法调用了&#xff0c;特别是边界层中原先已经算好的变量&#xff0c;比如说我想调用原来模式中的pblh,但是那是在vertical diffusion.F90中计算的&#xff0c;在tphysac中根本调…

基于springcloud实现的医院信息系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 医疗信息就诊系统&#xff0c;系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成&#xff0c;并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以…

以前以为去流量大的部门是好事,能学技术,现在才知道,流量大的部门狗都不去!晚上9点才下班,一天到晚都是监控告警!...

流量大的部门好&#xff0c;还是流量小的部门好&#xff1f; 一位网友说&#xff0c;工作以前以为去流量大的部门是好事&#xff0c;能学技术&#xff1b;工作后才知道&#xff0c;流量大的部门和组&#xff0c;狗都不去&#xff01;待在流量大的组&#xff0c;晚上9点起步才下…

p71 内网安全-域横向网络传输应用层隧道技术

数据来源 必备知识点&#xff1a; 1、代理和隧道技术区别? 代理&#xff1a;只是解决网络的访问问题&#xff08;如&#xff1a;有些内网访问不到&#xff0c;可以用代理实现&#xff09; 隧道&#xff1a;隧道不仅是解决网络的通信问题&#xff0c;更大的作用是绕过过滤&…

菜刀、蚁剑以及冰蝎三款Webshell管理工具简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是菜刀、蚁剑以及冰蝎三款Webshell管理工具简介。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&…

YOLO(你只需看一眼)技术通讲(基于论文与开源代码)

YOLO通讲 前言YOLO v1论文及项目地址介绍模型架构统一检测边界框的置信度类置信度 网络设计训练 模型局限总结 YOLO v2模型改进正则化批处理使用高分辨率分类器卷积化锚盒维度聚类 前言 YOLO作为现在目标检测技术中较为基础且流行的技术之一。本文将以开源者的论文与模型为基础…

UE5实现物体高亮描边效果(含UE相关源码浅析)

文章目录 1.实现目标2.实现过程2.1 UE Editor中相关源码2.2 深度值描边2.3 半透明材质处理2.4 遮挡处理2.5 视口边缘处理3.参考资料1.实现目标 在UE5中实现物体边缘高亮效果,且在被遮挡时在边缘显示不同的颜色,当到达视口边缘时,也会将该物体与视口边缘相交的部分高亮。 2.…