JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)

目录

Arrays

Arrays类提供的的常见方法

用法示例

Comparable、Comparator

Comparable

Comparator


本篇学习Arrays,不算作是重点知识,但是为学习后面的Lambda表达式打一个基础,或者说,作为铺垫。

Arrays

  • 用来操作数组的一个工具类。

Arrays类提供的的常见方法

方法名说明
public static String toString(类型[] arr)返回数组的内容
public static int[] copyOfRange(类型[] arr,起始索引,结束索引)拷贝数组(指定范围)
public static copyOf(类型[] arr, int newLength)拷贝数组
public static setAll(double[] array, IntToDoubleFunction generator)把数组中的原数据改为新数据
public static void sort(类型[] arr) 对数组进行排序(默认是升序排序)

用法示例

public static String toString(类型[] arr)

//1.toString返回数组的内容
int[] arr = new int[]{10,20,30,40,50,60};
System.out.println(Arrays.toString(arr));

public static int[] copyOfRange(类型[] arr,起始索引,结束索引)

int[] arr = new int[]{10,20,30,40,50,60};//2.拷贝数组 (类型[] arr,起始索引,结束索引)   索引包前不包后
int[] arr2 = Arrays.copyOfRange(arr,1,4);
System.out.println(Arrays.toString(arr2));

public static copyOf(类型[] arr, int newLength)

int[] arr = new int[]{10,20,30,40,50,60};//3.拷贝数组,可以指定新数组的长度   (类型[] arr,newLength)
int[] arr3 = Arrays.copyOf(arr,10);
System.out.println(Arrays.toString(arr3));

public static setAll(double[] array, IntToDoubleFunction generator)

public class Test {public static void main(String[] args){//4.把数组中的原数据改为新数据double[] prices = {99.8,128,100};System.out.println("原价:" + Arrays.toString(prices));//把所有的价格都打八折,然后再存进数组Arrays.setAll(prices, new IntToDoubleFunction() {@Overridepublic double applyAsDouble(int value) {return prices[value] * 0.8;//value = 0  1  2}});System.out.println("打完八折后:" + Arrays.toString(prices));}
}

运行结果:

看setAll的源码:

public static void sort(类型[] arr) 

public class Test {public static void main(String[] args){//4.把数组中的原数据改为新数据double[] prices = {99.8,128,100};System.out.println("排序前:" + Arrays.toString(prices));//5.对数组进行排序(默认是升序排序)Arrays.sort(prices);System.out.println("排序后:" + Arrays.toString(prices));}
}

运行结果:

Comparable、Comparator

如果数组中存储的是对象,那该如何排序呢?

Arrays.sort中没有指定对于对象的排序规则,不知道根据什么来排序,所以如果用它来对对象排序的话是会报错的。

解决方式

  • 方式一让该对象的类实现Comparable(比较规则)接口,然后重写compareTo方法,自己来制定比较规则
  • 方式二使用下面这个sort方法,创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则
public static<T>void sort(T[]arr,Comparator<?super T>c)
//对数组进行排序(支持自定义排序规则)

 我们来看方式一:实现Comparable接口

Comparable

public class Test {public static void main(String[] args){Student[] students = new Student[4];students[0] = new Student("蜘蛛精",169.5,24);students[1] = new Student("紫霞",163.8,25);students[2] = new Student("紫霞",163.8,25);students[3] = new Student("至尊宝",167.5,21);//1.对数组进行排序Arrays.sort(students);System.out.println(Arrays.toString(students));}
}
package user.APITest;public class Student implements  Comparable<Student>{private String name;private double height;private int age;//制定比较规则//假设this 与 o 进行比较@Overridepublic int compareTo(Student o) {//约定1:认为左边对象 大于 右边对象,则要返回正整数//约定2:认为左边对象 小于 右边对象,则要返回负整数//约定3:认为左边对象 等于 右边对象,则要返回0//按照年龄升序排序if(this.age > o.age){return 1;}else if(this.age < o.age){return -1;}return 0;}//重写toString方法@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", height=" + height +", age=" + age +'}';}public Student() {}public Student(String name, double height, int age) {this.name = name;this.height = height;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

通过让对象的类实现Comparable接口并且重写compareTo方法,可以自定义排序规则,对对象数组进行排序,运行结果:

注意:这里制定排序规则,我们可以换一下编码思路,改得更简洁一点 

例如:

    //制定比较规则//假设this 与 o 进行比较@Overridepublic int compareTo(Student o) {//约定1:认为左边对象 大于 右边对象,则要返回正整数//约定2:认为左边对象 小于 右边对象,则要返回负整数//约定3:认为左边对象 等于 右边对象,则要返回0//按照年龄升序排序
//        if(this.age > o.age){
//            return 1;
//        }else if(this.age < o.age){
//            return -1;
//        }
//        return 0;return this.age - o.age;}

 如果要将升序排序改为降序,那调换一下位置即可:

return o.age - this.age;

 也就是原本this > o,按升序进行相减时返回正整数;那么换位置进行相减得到负整数,从原本认为this > o的改为了o > this。也就是说,返回负整数,证明左边对象this 小于 右边对象o。

接下来再看方式二:Comparator

Comparator

现在来排序Student类里面的身高,方式二实际上是调用sort的重载方法,其参数需要传入该对象以及Comparator比较器接口的匿名内部类对象。

public class Test {public static void main(String[] args){Student[] students = new Student[4];students[0] = new Student("蜘蛛精",169.5,24);students[1] = new Student("紫霞",163.8,25);students[2] = new Student("紫霞",163.8,25);students[3] = new Student("至尊宝",167.5,21);//2.方式二:创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则。Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//制定比较规则//o1    o2//这里的规则是与前面一模一样的//约定1:认为左边对象 大于 右边对象,则要返回正整数//约定2:认为左边对象 小于 右边对象,则要返回负整数//约定3:认为左边对象 等于 右边对象,则要返回0//根据身高排序//return o1.getHeight() - o2.getHeight(); //这里就不能使用之前那种编码方式了,不能保证相减得到的正整数是准确的结果//先来看第一种:  升序if(o1.getHeight() > o2.getHeight()){return 1;}else if(o1.getHeight() < o2.getHeight()){return -1;}return 0;}});System.out.println(Arrays.toString(students));}
}

运行结果:

将排序规则的编码简化:

下篇就要学习Lambda表达式,对匿名内部类进行简化。


END


学习自:黑马程序员——JavaSE课程

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

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

相关文章

华为OD机试 - 智能驾驶 - 广度优先搜索(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Mybatis 缓存机制

序言 本文和大家聊聊 Mybatis 缓存。 一、本地缓存 Mybatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制。 默认情况下&#xff0c;只启用了本地的会话缓存&#xff08;又称一级缓存&#xff09;&#xff0c;它仅仅对一个会话中的数据进行缓…

上海亚商投顾:沪指缩量调整 有色、煤炭等周期股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量调整&#xff0c;午后一度跌近1%&#xff0c;黄白二线走势分化&#xff0c;微盘股指数涨超3%。军…

单片机使用循环来实现延时和定时器延时的区别是什么?

循环延时是一种简单的实现方式&#xff0c;但由于资源占用和精确度的限制。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在…

Linux中的vi与vim:编辑器的王者之争与深度探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标&#xff1a; 掌握 Java Stream流的相关api 掌握 Java Stream流的基本实现 掌握 java Stream流的使用场景 代码已经整理上传到了gitee中&#xff0c;有需要的小伙伴可以取查看一下源码点个小心心喔 大家也可以帮我提交一点案例喔&#xff01;&#xff01;&#xff01;&…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

docker容器技术篇:容器集群管理实战mesos+zookeeper+marathon(一)

容器集群管理实战mesoszookeepermarathon&#xff08;一&#xff09; mesos概述 1.1 Mesos是什么 Apache Mesos 是一个基于多资源调度的集群管理软件&#xff0c;提供了有效的、跨分布式应用或框架的资源隔离和共享&#xff0c;可以运行 Hadoop、Spark以及docker等。 1.2 为…

maven多模块创建-安装配置

1、前提 许久没有写文章了&#xff0c;荒废了2年多的时间&#xff0c;在整理的时候&#xff0c;发现Maven还差一篇安装配置的文章&#xff0c;现在开始提笔完善它&#xff0c;参考&#xff1a;https://blog.csdn.net/m0_72803119/article/details/134634164。 —写于2024年4月…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

自然语言处理: 第二十八章大模型基底之llama3

项目地址: meta-llama/llama3: The official Meta Llama 3 GitHub site 前言 LLaMa系列一直是人们关注的焦点&#xff0c;Meta在4月18日发布了其最新大型语言模型 LLaMA 3。该模型将被集成到其虚拟助手Meta AI中。Meta自称8B和70B的LLaMA 3是当今 8B 和 70B 参数规模的最佳模…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

ISP比普通的静态代理相比有什么优势?

ISP&#xff08;Internet Service Provider&#xff09;&#xff0c;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址&#xff0c;具有稳定性强、兼容性好和管理方便等特点。当我…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

基于Python+Selenium+Pytest的Dockerfile如何写

使用 Dockerfile 部署 Python 应用程序与 Selenium 测试 在本文中&#xff0c;我们将介绍如何使用 Dockerfile 部署一个 Python 应用程序&#xff0c;同时利用 Selenium 进行自动化测试。我们将使用官方的 Python 运行时作为父镜像&#xff0c;并在其中安装所需的依赖项和工具…

【白菜学习问问问系列】if __name__ == ‘__main__‘:怎么理解

可以让.py文件既可以当成一个模块调用&#xff0c;也可以单独的作为一个函数执行

用html画一个四叶草

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>四叶草</title> <link href"" rel"stylesheet"> <link rel"stylesheet" href"css/style.css&q…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…