Java数组操作

数组拓展

1.1 数组拷贝

需求:定义一个方法arraycopy, 从指定源数组中从指定的位置开始复制指定数量的元素到目标数组的指定位置。

1.2. 排序操作

需求:完成对int[] arr = new int[]{2,9,6,7,4,1}数组元素的升序排序操作.

1.2.1.冒泡排序

对未排序的各元素从头到尾依次比较相邻两个元素的大小关系,如果前一个元素大于后一个元素则交换位置,经过第一轮比较后可以得到最大值,同理第二轮比较后出现第二大值,以此类推,直到数组中数据有有序。

针对int[] arr = new int[]{ 2, 9, 6, 7, 4, 1 }数组元素做排序操作:

2轮比较:需要比较4次,比较完出现第二个大值。

3轮比较:需要比较3次,比较完出现第三个大值。

4轮比较:需要比较2次,比较完出现第四个大值。

5轮比较:需要比较1次,比较完出现第五个大值。

可以看出如有N个元素,则需要N-1轮比较,第M轮需要N-M次比较。

该数组有6个元素,只需要5轮比较。

交换数组中两个元素的方法

排序方法:

1.3 二分法查找

查找数组元素的算法:

 线性查找:从头找到尾,性能比较低。

 二分法查找(折半查找):前提数组元素是有序的,性能非常优异。

1.3.1 二分法搜索原理

猜数字游戏:电脑随机生成一个[ 1 , 100 ]之间的商品价格,等玩家来猜,猜之后,电脑提示出三种结果:你猜的数偏大,偏小和猜中了。

此时为了以最少次数猜中 ,玩家决定

先猜(1+100/ 2的商50,如果此时电脑提示猜的偏小了,那就能推断出该随机数在[ 51 , 100 ]之间,此时再猜(51+100/ 2的商75,如果电脑提示猜大了,那么该随机数必在[ 51 , 74 ]之间,那么继续猜(51+74/2的商,如此每次都可以排除剩下结果一半的可能性,直到猜到为止。

关键字:以最少的次数猜中,在规定的时间(10分钟)猜中最多。

代码如下:

1.4. 操作数组的API-Arrays

类似打印数组元素的这样的工具性的方法,其实SUN公司的攻城狮们早就写好代码了,并封装在了很多工具类中,我们把这种预先定义好的方法,称为API。对于我们而言,最基本的要求就是能调用这些方法,当然我们对自己有更高的要求,应该知其然,并知其所以然。

学习API一定要掌握一个秘诀:文档在手, 天下我有! 一定要经常性的查文档!!

Arrays工具类中的方法,一般都是使用static修饰的。

打开JDK帮助文档,搜索Arrays类,进入该类的文档页面,去找toString方法,发现在Arrays类中有多个toString方法,他们之间属于重载关系,分别用于打印不同类型的数组。

: 查看Arrays类中将int类型数组转换成字符串的toString方法。

如果看方法列表看不懂怎么使用,使用鼠标左键点击该方法名称,进入该方法的详细:

如果看不懂,就要静下心来多看几次,必须掌握每一部分到底在表达什么意思。

1.4.1. 打印数组元素

API中还有一个专门操作数组的工具类Arrays,该类提供了对数组元素的拷贝、元素搜索、元素排序、打印等功能方法,且该类为不同数据类型的数组都重载了相同功能的方法。

通过调用Arrays类中的toString方法完成打印数组元素的功能,掌握如何给类定义包、导入类以及看API文档。

1.4.2. 拷贝数组元素

Arrays 中提供了数组复制的方法,copyOf(int[] original, int newLength) 复制指定的数组,截取或者用0填充。

System类中提供了数组元素拷贝的方法,并且支持任意类型的数组拷贝,而不仅仅是int类型数组。

1.4.3. 数组元素排序

Arrays类中已经提供了数组排序的方法sort,并且是调优之后的,性能非常优异,在开发中只需要我们直接调用该方法即可即可。

1.4.4. 数组元素二分查找

Arrays类中已经提供了数组元素的二分查找。

小结:排序和二分法查找的原理需要掌握,当然, 在实际开发中, 会调用Arrays类中方法完成相关功能即可。

1.5 数组元素的增删改查操作

假设我现在是某个篮球队的教练,需要安排5个球员上场打球。此时需要模拟上场球员的存储,简单一点,我们就只存储上场球员的球衣号码。那么此时我需要以下几个操作:

1初始一个容量5的容器,用来存储场上的5个球衣号码。

2.安排5个球员上场,比如球员号码分别为1122334455

3查询指定索引位置球员的球衣号码是多少,如查询索引位置为2的球衣号码是33

4替换场上索引位置为2的球员,使用333号替换33号。

5罚下场上索引位置为2的球员(直接罚下,没有补位)。

6打印出场上球员的球衣号码,打印风格如 [1122334455]

思考1:用于什么存储上面的号码?,需不需要一个存储号码的容器?你想到谁?

思考2:试想给你一个数组 [11,22,33,44,55] , 会不会对数组容器中的元素进行加、除、修

思考3:试想我再给你一个数组 [10,20,30,40] 还需要你增删改查,刚才写的代码能复用吗?思考4:我们能不能对封装思维的理解进一步升华 ?

1.5.7 让容器支持存储任意数据类型的元素

此时元素类型是Integer类型,也就是只能存储整型的数据,但是却不能存储其他类型的数据,此时我们可以考虑吧元素类型改成Object,那么Object数组可以存储任意类型的数据。

import java.util.Arrays;

public class MyArrayList {

//存储元素容器

private Object[] elementData = null;

//记录元素个数

private int size = 0;

//自定义初始容量

public MyArrayList(int initialCapacity) {

if (initialCapacity < 0) {

System.out.println("初始容量不能为负数");

return;

}

this.elementData = new Object[initialCapacity];

}

//默认初始容量为10 public MyArrayList() {

this(10);

}

//向容器中添加一个元素

public void add(Object e) {

//如果容器容量已满,此时需要扩容,此时扩容机制为原来容量的2倍 if (size == elementData.length) {

this.elementData = Arrays.copyOf(this.elementData, size * 2);

}

//-----------------------------------------

this.elementData[size] = e;

size++;// 容器中元素数量加1

}

//查询指定位置的元素

public Object get(int index) {
if (index < 0 || index >= size) {

System.out.println("索引越界");

return null;

}

return this.elementData[index];

}

//替换指定索引位置的元素

public void set(int index, Object e) {

if (index < 0 || index >= size) {

System.out.println("索引越界");

return;

}

this.elementData[index] = e;

}

//删除指定索引位置的元素

public void remove(int index) {

if (index < 0 || index >= size) {

System.out.println("索引越界");

return;

}

for (int i = index; i < size - 1; i++) {

this.elementData[i] = this.elementData[i + 1];

}

this.elementData[size - 1] = null;

size--;

}

public String toString() {

if (elementData == null) {// 如果没有初始化容器 return "null";

}

if (size == 0) {// 如果容器中元素数量为0

return "[]";

}

StringBuilder sb = new StringBuilder(40);

sb.append("[");

for (int index = 0; index < size; index++) { sb.append(this.elementData[index]);
//如果不是最后一个元素

if (index != size - 1) {

sb.append(",");

} else {

sb.append("]");

}

}

return sb.toString();

}

}

注:此案例为了引出学习List的原理

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

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

相关文章

【计算机毕设】基于SpringBoot的教师工作量管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 随着高校规模的扩大和教学任务的增加&#xff0c;教师的工作量管理变得越来越复杂和重要。传统的教师工作量管理方式效率低下&#xff0c;容易出错&…

【typescript/flatbuffer】在websocket中使用flatbuffer

目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统&#xff1a;Windows11node版本&#xff1a;v18.19.0typescript flatbuffer版本&#xff1a;24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…

CSDN UI 2024.06.01

当我们的栏目很多的时候&#xff0c;通过【置顶】来排列顺序是很麻烦的&#xff0c;应该加一列&#xff0c;设置优先级别。太难用了 或者加两个按钮【上移】 【下移】

正邦科技(day4)

烧录 一、烧录固件二、 通讯模块升级1&#xff1a;USB的方式升级固件2&#xff1a;通过mqtt的方式升级固件3&#xff1a;切换环境 三、 烧录WiFi1&#xff1a;短接2&#xff1a;烧录脚本 设备注意事项&#xff1a; 第一种方式&#xff1a;通信模组和MCU都可以统一烧录BoodLoade…

内网穿透-FRP流量改造

前言 在拿下一台机器作为入口时&#xff0c;内网代理就变得尤为重要。他是我们进行横向渗透一个中间人&#xff0c;没了代理在内网中就寸步难行。而内网穿透的工具有很多&#xff0c;比如frp&#xff0c;reGeorg等等非常优秀的代理工具。使用方法不在赘述&#xff0c;这篇文章…

ssm_mysql_高校自习室预约系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Ansible05-Ansible进阶(流程控制、Roles角色、加密优化调优等)

目录 写在前面7 Ansible 进阶7.1 流程控制7.1.1 handlers触发器与notify7.1.1.1 未使用handlers7.1.1.2 使用handlers 7.1.2 when判断7.1.2.1 when的语法7.1.2.2 when判断主机名选择模块输出7.1.2.3 when结合register变量 7.1.3 loop/with_items循环7.1.3.1 with_items案例7.1.…

微信小程序注册流程及APPID,APPSecret获取

1.注册微信小程序 注册链接&#xff1a;公众号 (qq.com) 1.1填写邮箱、密码、验证码 1.2邮箱登录点击邮件中链接激活&#xff0c;即可完成注册 1.3用户信息登记 接下来步骤&#xff0c;将用个人主题类型来进行演示 填写主体登记信息&#xff0c;使用管理员本人微信扫描二维码…

行政工作如何提高效率?桌面备忘录便签软件哪个好

在行政管理工作中&#xff0c;效率的提高无疑是每个行政人员都追求的目标。而随着科技的发展&#xff0c;各种便捷的工具也应运而生&#xff0c;其中桌面备忘录便签软件便是其中的佼佼者。那么&#xff0c;这类软件又如何帮助我们提高工作效率呢&#xff1f; 首先&#xff0c;…

(2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少

LoRA Learns Less and Forgets Less 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 2. 背景 3. 实验设置 3.2 使用编码和数学基准测试来衡量学习&#xff08;目标域…

C++:细谈Sleep和_sleep

ZINCFFO的提醒 还记得上上上上上上上上上上上上上上上上上上&#xff08;上的个数是真实的&#xff09;篇文章吗&#xff1f; 随机应变——Sleep()和_sleep() 但在ZINCFFO的C怪谈-02中&#xff1a; 我不喜欢Sleep...... 奤&#xff1f;媜煞鷥&#xff01; 整活&#xff01;…

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…

权限修饰符和代码块

一.权限修饰符 1.权限修饰符:是用来控制一个成员能够被访问的范围的。 2.可以修饰成员变量&#xff0c;方法&#xff0c;构造方法,内部类。 3.例子&#xff1a; public class Student {priviate String name;prviate int age;} 二.权限修饰符的分类 有四种作用范围大小…

牛客网刷题 | BC102 带空格直角三角形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

#1 深度优先搜索

深搜思想 DFS其实是针对图论的一种搜索算法&#xff0c;由一个节点出发&#xff0c;不撞南墙不回头式的遍历所有的节点。 如先遍历1&#xff0c;沿&#xff08;1,2&#xff09;遍历2&#xff0c;再沿&#xff08;2,4&#xff09;遍历4&#xff0c;撞南墙&#xff08;边界条件…

bcaktrader策略编写1

。 1 Backtrader策略类编写说明 在上一篇&#xff0c;我大体记录了整个backtrader整体最简流程&#xff0c;策略类中没有实现任何买卖逻辑&#xff0c;只是单纯的打印了每日的收盘价。今天&#xff0c;我将详细介绍策略编写类的构建过程&#xff0c;并构建一个简单的均线策略…

林业调查具体是做些什么?

林业调查是对森林资源进行系统的信息收集和处理的过程。 林业调查涵盖了对林木、林地以及林区内生长的动植物及其环境条件的全面评估&#xff0c;旨在及时掌握森林资源的数量、质量和生长消亡的动态规律。这种调查不仅关注森林本身&#xff0c;还包括与之相关的自然环境和经济…

分销与传销的界限

分销与传销&#xff0c;作为商业活动中的两种销售模式&#xff0c;确实在核心特征和法律地位上存在显著的区别。以下是关于两者的详细分析&#xff0c;以及为什么选择微信分销小程序时&#xff0c;通常建议找外包公司的理由。 一、分销与传销的区别 商业模式&#xff1a; 分销…

【String 类 常用方法详解和归类】全网最细总结

目录 一、 String 介绍二、String 类中查找字符串的方法2.1 常用查找在这里插入图片描述2.2、其他查找 三、转换功能3.1 常用转换方法3.2、其他转换方法 四、判断、比较相关方法4.1、常用判断、比较方法4.2、其他判断、比较方法 五、拆分,截取,替换方法5.1、常用拆分,截取,替换…

linux---生产者和消费者模型

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xff0c;消费者不找生产者要数据&#…