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

news2024/12/24 3:03:32

文章目录

  • 一、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/500035.html

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

相关文章

神经网络实验---梯度下降法

本次实验主要目的是掌握梯度下降法的基本原理&#xff0c;能够使用梯度下降法求解一元和多元线性回归问题。 文章目录 目录 文章目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 实验小结&讨论题 1. 实验目的 ① 掌握…

〖Python网络爬虫实战㉓〗- Ajax数据爬取之什么是Ajax

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

23.5.7总结(学习通项目思路)

项目思路&#xff1a; 注册&#xff1a;输入邮箱&#xff08;判重&#xff09;&#xff0c;两次输入密码&#xff0c;获得的正确的验证码&#xff0c;获得不重复的用户名。 登录&#xff1a;输入用户名和密码登录。 忘记密码&#xff1a;输入邮箱&#xff08;和用户名&#…

RK3588平台开发系列讲解(进程篇)可执行文件内部结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 ELF 文件的两大组成部分二、文件头三、程序头和节区头四、ELF 文件的细节结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在 Linux 中,二进制可执行文件的标准格式叫做 ELF(Executable and Linkabl…

ARP协议结构

文章目录 概念ARP协议格式ARP协议的作用ARP协议的工作流程 首先提出一个问题&#xff0c;来理解ARP解决什么问题 已知报文在数据链路层传输的过程中&#xff08;假设是主机A到主机B&#xff09;&#xff0c;是通过路由器之间的跳转&#xff0c;根据路由表&#xff0c;结合目的…

【论文】SimCLS:一个简单的框架 摘要总结的对比学习(1)

SimCLS:摘要总结的对比学习(1&#xff09; 写在最前面模型框架 摘要1 简介 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization&#xff08;2021ACL会议&#xff09; https://arxiv.org/abs/2106.01890 论文&#xff1a;https://…

【c语言小demo】登录demo | 账号密码验证功能

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

postgresql insert ddl执行流程分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 总体流程 调用堆栈 执行接口说明 详细流程分解 ExecInsert对于普通表…

Java9

Java9 &#xff08;一&#xff09;、stream流1.1 Stream流的中间方法和终结方法 &#xff08;二&#xff09;、方法引用2.1 方法引用的分类 &#xff08;三&#xff09;、异常3.1 编译时异常和运行时异常3.2 异常的作用3.3 异常的处理方式3.4 异常中的常见方法3.5 自定义异常 &…

麒麟设置分辨率

为什么要设置------额。。。。虚拟机启动的&#xff0c;直接满屏了。。。。也不能移动 命令设置法 1、可以通过xrandr命令来设置屏幕分辨率。先查询当前分辨率&#xff0c;及当前支持的分辨率。 xrandr 2、可以通过-s参数来设置为1920x1440 xrandr -s 1920x1440 这就好…

Midjouney prompt优化

Midjouney prompt优化 总述1. Midjouney1.1 常见出图方式1.2 图片参数 2. prompt2.1 prompt关键词框架逻辑2.2 关键词技巧2.3 分类关键词2.3.1 媒体类型、介质和渲染引擎2.3.2 艺术风格2.3.2.1常见风格关键词2.3.2.2 艺术风格介绍2.3.2.3 绘画风格关键词和作品 2.3.3 相机镜头和…

面试官从这些方面考察你的Android开发水平!

View基础(25题) 什么是ViewView的位置参数MotionEventViewRootDecorViewMeasureSpec View三大流程(28题) measure过程ViewViewGrouplayout过程draw过程获取View的宽高Activity启动到加载ViewRoot的流程 自定义View(26题) 四种实现方法直接继承View自定义属性直接继承ViewG…

C++三大特性—继承“复杂的菱形继承及菱形虚拟继承”

C的一个大坑&#xff1a;菱形继承 希望这篇文章能让你理解什么是菱形继承&#xff0c;以及菱形继承的注意事项 单继承与多继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承…

【半监督学习】Match系列.2

本文简单介绍半监督算法中的Match系列方法&#xff1a;CoMatch&#xff08;ICCV2021&#xff09;&#xff0c;CRMatch&#xff08;GCPR2021&#xff09;&#xff0c;Dash&#xff08;ICML2021&#xff09;&#xff0c;UPS&#xff08;ICLR2021&#xff09;&#xff0c;SimMatch…

ajax、fetch、axios三者的异同

同&#xff1a;都是发送网络请求 异&#xff1a; 1.ajax ajax是异步的javascript和xml&#xff0c;用于创建快速的动态网页的技术。&#xff08;用js发送异步的网络请求&#xff09; 特点&#xff1a;局部刷新页面&#xff0c;无需重载整个页面。 很多小伙伴会误以为ajax是…

2023年的深度学习入门指南(12) - PEFT与LoRA

2023年的深度学习入门指南(12) - PEFT与LoRA 大家都知道&#xff0c;大模型的训练需要海量的算力。其实&#xff0c;即使是只对大模型做微调训练&#xff0c;也是需要大量的计算资源的。 有没有用更少的计算资源来进行微调的方法呢&#xff1f;研究者研发出了几种被Hugging F…

fastCGI使用

1.http解释 在使用fastCGI之前需要先了解什么是http&#xff0c;以及静态请求和动态请求。 1.什么是http HTTP是超文本传输协议&#xff0c;它定义了客户端和服务器端之间文本传输的规范。HTTP通常运行在TCP之上&#xff0c;使用80端口。HTTP是一种简单的请求-响应协议&#x…

GUN C编译器拓展语法学习笔记(二)属性声明

一、属性声明 1、存储段&#xff1a;section 1.1 GNU C编译器扩展关键字&#xff1a;__attribute__ GNU C增加了一个__attribute__关键字用来声明一个函数、变量或类型的特殊属性。主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查。例如&#xff0c;我们可以…

C语言三子棋小游戏

哈喽&#xff0c;大家好&#xff0c;今天我们要利用之前所学习的C语言知识来写一个三子棋小游戏。 目录 1.游戏 2.函数部分 2.1.菜单 2.2.初始化棋盘 2.3.打印棋盘 2.4.玩家下棋 2.5.电脑下棋 2.6.判断输赢 2.7.判断棋盘是否已满 3.完整代码展示 1.游戏 今天我们写的…

未知时间信息下雷达运动目标的计算高效重聚焦与估计方法

论文背景 在雷达成像中&#xff0c;回波信号在接收到之前可能已经被多次反射或散射&#xff0c;这样会导致回波信号的时间和频率发生变化。其中&#xff0c;距离向维度上的变化称为距离单元迁移&#xff08;range cell migration&#xff0c;RCM&#xff09;&#xff0c;频率向…