Java数据结构-模拟ArrayList集合思想,手写底层源码(1),底层数据结构是数组,编写add添加方法,正序打印和倒叙打印

package com.atguigu.structure;
public class Demo02_arrayList {public static void main(String[] args) {MyGenericArrayListV1 arrayListV1 = new MyGenericArrayListV1();//arr.add(element:100,index:1);下标越界,无法插入//初始化(第一次添加)  elements=[0,0,0,0,0]  size=0//第二次添加前  elements=[10,0,0,0,0]   size=1//第三次添加前  elements=[10,20,0,0,0]  size=2arrayListV1.add(10, 0);arrayListV1.add(20, 1);arrayListV1.add(30, 2);//打印前  elements=[10,20,30,0,0]  size=3arrayListV1.print();//10 20 30 0 0//10 20 30 0 0 elements=[10,20,30,0,0]  size=3//第四次添加前   elements=[10,20,30,0,0]  size=3arrayListV1.add(40,0);//第五次添加前   elements=[40,10,20,30,0]  size=4arrayListV1.add(50,0);//打印  elements=[50,40,10,20,30]   size=5arrayListV1.print();//50 40 10 20 30//倒叙打印前  elements=[50,40,10,20,30]   size=5arrayListV1.printRev();//30 20 10 40 50}
}
class MyGenericArrayListV1{//组织存储数据的结构private int[] elements;//数据关系的属性//The size of the ArrayList (the number of elements it contains)//这里说的元素的数量指的是ArrayList集合元素的数量,不是底层数组,底层数组只有长度//ArrayList集合的大小(包含元素的数量)private int size;public MyGenericArrayListV1() {this(5);}public MyGenericArrayListV1(int capacity) {elements = new int[capacity];size = 0;}//操作数据的方法://1、新增:根据下标插入数据、头插 、 尾插public void add(int element, int index) {//参数1:要新增的数据   参数2:要插入的位置下标//第一次添加 element=10   index=0    size=0//第二次添加 element=20   index=1    size=1//第三次添加 element=30   index=2    size=2//第四次添加 element=40   index=0    size=3//第五次添加 element=50   index=0    size=4if (isFull()) {System.out.println("数组已满,无法插入");return;}//数组数据是连续存储的,不能跳过未存储数据的位置//第一次添加   index=0  size=0   element=10   elements=[0,0,0,0,0]//第二次添加   index=1  size=1   element=20   elements=[10,0,0,0,0]//第三次添加   index=2  size=2   element=30   elements=[10,20,0,0,0]//第四次添加   index=0  size=3   element=40   elements=[10.20,30,0,0]//第五次添加   index=0  size=4   element=50   elements=[40,10,20,30,0]if (index<0||index>size) {System.out.println("下标越界,无法插入");return;}//如果新增时,数组中没有元素,添加到第一个索引位置 直接存入//如果位置上已存在元素 当前索引位置旧元素需要往后移动//[1,2,3,4,0]  => 将 5 插入到索引为 index(1) 的位置 [1,5,2,3,4]  ==>设置5到索引1位置//[1,2,3,0,0]  => 将 5 插入到索引为 index(1) 的位置 [1,5,2,3,0]  ==>设置5到索引1位置//判断要存入的位置是否需要移动元素//第一次添加  index=0  size=0  i=size-1=-1>0 -1>不大于0 所以循环进不去,不用移动元素//第二次添加  index=1  size=1  i=size-1=0>1  0不大于1 所以循环进不去,不用移动元素//第三次添加  index=2  size=2  i=size-1=1>2  1不大于2 所以循环进不去,不用移动元素//第四次添加  index=0  size=3  i=size-1=2>0  2大于0满足条件,进入循环,移动元素//第五次添加  index=0  size=4  i=size-1=3>0  3大于0满足条件,进入循环,移动元素for (int i = size - 1; i >= index; i--) {//第四次添加 i=2  elements=[10,20,30,0,0]   elements=[10,20,30,30,0]//		  i=1  elements=[10,20,30,30,0]  elements=[10,20,20,30,0]//		  i=0  elements=[10,20,20,30,0]	 elements=[10,10,20,30,0]//第五次添加   i=3   elements=[40,10,20,30,0]  elements=[40,10,20,30,30]//            i=2   elements=[40,10,20,30,30] elements=[40,10,20,20,30]//			i=1   elements=[40,10,20,10,30] elements=[40,10,10,20,30]//     		i=0   elements=[40,10,10,20,30] elements=[40,40,10,20,30]elements[i + 1] = elements[i];}//第一次添加前   element=10   index=0    elements=[0,0,0,0,0]//第一次添加后   element=10   index=0    elements=[10,0,0,0,0]//第二次添加前   element=20   index=1    elements=[10,0,0,0,0]//第二次添加后   element=20   index=1    elements=[10,20,0,0,0]//第三次添加前   element=30   index=2    elements=[10,20,0,0,0]//第三次添加后   element=30   index=2    elements=[10,20,30,0,0]//第四次添加前     element=40   index=0    elements=[10,10,20,30,0]//第四次添加后     element=40   index=0    elements=[40,10,20,30,0]//第五次添加前     element=50   index=0    elements=[40,40,10,20,30]//第五次添加后     element=50   index=0    elements=[50,40,10,20,30]elements[index] = element;//第一次添加  size=0 变成 size=1  element=10  index=0//第二次添加  size=1 变成 size=2  element=20  index=1//第三次添加  size=2 变成 size=3  element=30  index=2//第四次添加  size=3 变成 size=4  element=40  index=0//第五次添加  size=4 变成 size=5  element=50  index=0size++;}//2、删除//3、修改//4、查询//辅助方法:新增数据时size++,移除数据时size--//是否为空public boolean isEmpty() {//第一次打印   size=3  此方法不成立  返回false//第二次打印   size=5  此方法不成立  返回false//倒叙打印     size=5  此方法不成立  返回falsereturn size == 0;}//是否已满public boolean isFull() {//第一次添加    elements=[0,0,0,0,0]  size=0    elements.length=5//第二次添加    elements=[10,0,0,0,0]  size=1   elements.length=5 //第三次添加    elements=[10,20,0,0,0]  size=2  elements.length=5//第四次添加    elements=[10,20,30,0,0]  size=3  elements.length=5//第五次添加    elements=[40,10,20,30,0]  size=4  elements.length=5return size == this.elements.length;}//正序打印public void print() {//elements.length=5     elements=[10,20,30,0,0]if (isEmpty()) {return;}//第一次打印   elements=[10,20,30,0,0]  elements.length=5//第二次打印   elements=[50,40,10,20,30]  elements.length=5for (int i = 0; i < this.elements.length; i++) {//第一次循环  i=0  elements=[10,20,30,0,0]  elements[i]=10  elements.length=5//第二次循环  i=1  elements=[10,20,30,0,0]  elements[i]=20  elements.length=5//第三次循环  i=2  elements=[10,20,30,0,0]  elements[i]=30  elements.length=5//第四次循环  i=3  elements=[10,20,30,0,0]  elements[i]=0  elements.length=5//第五次循环  i=4  elements=[10,20,30,0,0]  elements[i]=0  elements.length=5//第一次循环  i=0 elements=[50,40,10,20,30] elements[i]=50  elements.length=5//第二次循环  i=1 elements=[50,40,10,20,30] elements[i]=40  elements.length=5//第三次循环  i=2 elements=[50,40,10,20,30] elements[i]=10  elements.length=5//第四次循环  i=3 elements=[50,40,10,20,30] elements[i]=20  elements.length=5//第五次循环  i=4 elements=[50,40,10,20,30] elements[i]=30  elements.length=5System.out.print(this.elements[i] + "\t");}System.out.println();}//反序打印public void printRev() {//倒叙打印前    elements.length=5    elements=[50,40,10,20,30]//判断完  isEmpty的返回值是false  所以进不去if  if (isEmpty()) {return;}//elements=[50,40,10,20,30]  elements.length=5int length = this.elements.length;//length=5   while (--length >= 0) {//第一次使用数组长度-1,当做下标取最后一个位置的元素打印//第二次使用长度-2//length=4 elements=[50,40,10,20,30] elements[4]=30  elements.length=5//length=3 elements=[50,40,10,20,30] elements[3]=20  elements.length=5//length=2 elements=[50,40,10,20,30] elements[2]=10  elements.length=5//length=1 elements=[50,40,10,20,30] elements[1]=40  elements.length=5//length=0 elements=[50,40,10,20,30] elements[0]=50  elements.length=5System.out.println(this.elements[length]+"\t");}System.out.println();}}

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

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

相关文章

Java 栈和队列的交互实现

文章目录 队列和栈的区别一.用队列模拟实现栈1.1入栈1.2出栈1.3返回栈顶元素1.4判断栈是否为空 二.用栈模拟实现队列2.1 入队2.2出队2.3peek2.4判断队列是否为空 三.完整代码3.1 队列模拟实现栈3.2栈模拟实现队列 队列和栈的区别 栈和队列都是常用的数据结构&#xff0c;它们的…

令人惊叹的代码技巧

在编程世界中&#xff0c;有一些令人惊叹的代码技巧和巧妙的实现方式。以下是一些我见过的令人印象深刻的代码技巧&#xff1a; 函数式编程魔法&#xff1a; 使用函数式编程的一些特性&#xff0c;比如高阶函数、匿名函数和Lambda表达式&#xff0c;可以使代码更为简洁、易读。…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

揭秘Spark学习框架网站:让你轻松掌握大数据处理神器!

介绍&#xff1a;Apache Spark是一个开源的大数据处理框架&#xff0c;它致力于实现高速、易用和复杂分析。Spark最初由加州大学伯克利分校的AMPLab于2009年开始开发&#xff0c;并于2010年成为Apache的开源项目之一。由于其出色的性能表现与丰富的功能特性&#xff0c;Spark已…

【计算机四级(网络工程师)笔记】操作系统概论

目录 一、OS的概念 1.1OS的定义 1.2OS的特征 1.2.1并发性 1.2.2共享性 1.2.3随机性 1.3研究OS的观点 1.3.1软件的观点 1.3.2资源管理器的观点 1.3.3进程的观点 1.3.4虚拟机的观点 1.3.5服务提供者的观点 二、OS的分类 2.1批处理操作系统 2.2分时操作系统 2.3实时操作系统 2.4嵌…

SpringBoot之IOCDI的详细解析

3.3.2 IOC详解 通过IOC和DI的入门程序呢&#xff0c;我们已经基本了解了IOC和DI的基础操作。接下来呢&#xff0c;我们学习下IOC控制反转和DI依赖注入的细节。 3.3.2.1 bean的声明 前面我们提到IOC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由…

c语言编写http服务器(Linux下运行)

参考文章&#xff1a;https://blog.csdn.net/baixingyubxy/article/details/125964986?spm1001.2014.3001.5506 上面是详细讲解&#xff0c;我这篇是总结了他的代码&#xff0c;因为他没给整体代码 所有代码&#xff1a; #include <stdio.h> #include <stdlib.h&g…

爬虫入门--爬取电影TOP250-附源码解析

爬取电影TOP250 1 知识小课堂1.1 什么是爬虫1.2 爬虫能做什么 2 代码解析2.1 运行环境2.2 过程解析2.2.1 第一步&#xff1a;引入两个模块2.2.2 找到网址2.2.3 拉去页面全内容 2.2.42.3 完整代码 1 知识小课堂 1.1 什么是爬虫 爬虫&#xff0c;也叫网络蜘蛛&#xff0c;如果把…

02 ModBus TCP

目录 一、ModBus TCP 一帧数据格式 二、0x01 读线圈状态 三、0x03读保持寄存器 四、0x05写单个线圈 五、0x06 写单个寄存器 六、0x0f写多个线圈 七、0x10&#xff1a;写多个保持寄存器 八、通信过程 九、不同modbus通信模式的应用场景 一、ModBus TCP 一帧数据格式 其…

图神经网络 (GNN) 概述

GNN 作者 with DALLE 3 一、说明 神经网络是受人脑工作启发的计算模型&#xff0c;能够从复杂的非结构化数据&#xff08;如图像、文本、音频和视频&#xff09;中学习。然而&#xff0c;还有许多其他类型的数据无法用传统的神经网络轻松表示&#xff0c;例如那些具有图形结构的…

基于YOLOv8的结核病预测系统设计与实现

一、项目背景 本系统的目的是通过痰液图像来检测出结核杆菌的携带者&#xff0c;及时采取治疗措施&#xff0c;在病情早期对其进行相关治疗减少结核病的传播。程序使用的样本是经过染色处理可以使得结核杆菌在显微镜拍摄的医学图像&#xff0c;通过检测医学图像中的结核杆菌诊…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore&#xff0c;Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

初始redis

目录 前言&#xff1a; 1.盛赞redis 2 redis特性 3.redis的典型应用场景 4.安装并启动redis 前言&#xff1a; 本章将带领读者进入Redis的世界&#xff0c;了解它的前世今生、众多特性、典型应用场景、安装配置、如何用好等&#xff0c;最后会对Redis发展过程中的重要版本…

EMNLP 2023 亮点回顾:大模型时代下的 NLP 研究

作为自然语言处理&#xff08;NLP&#xff09;领域的顶级盛会&#xff0c;EMNLP 每年都成为全球研究者的关注焦点。2023 年的会议在新加坡举行&#xff0c;聚集了数千名来自世界各地的专家学者&#xff0c;也是自疫情解禁以来&#xff0c;中国学者参会最多的一次。巧的是&#…

appium工具相关

一、appium基本介绍 1、appium 基本介绍 定义&#xff1a;appium 就是一款非常流行和好用的第三方工具&#xff0c;通过该工具我们可以配合 python 脚本实现 IOS / Android 多平台的APP 自动化测试。作用&#xff1a;在编写测试脚本的PC机和运行 APP 的真机或设备之前充当一个…

CSS操纵元素的禁用和启用

通常表单控件都会有属性readonly、disabled对元素进行只读、禁用等操作。 而有时候我们想要div也达到类似效果&#xff0c;可以用CSS样式pointer-events: none进行控制。 科普知识 CSS样式的pointer-events: none用于控制一个元素能否响应鼠标操作。当该属性设置为none时&am…

DC-8靶场

目录 DC-8靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap得到账号密码&#xff1a; 反弹shell&#xff1a; exim4提权&#xff1a; Flag&#xff1a; DC-8靶场链接&#xff1a; https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

程序员的20大Git面试问题及答案

文章目录 1.什么是Git&#xff1f;2.Git 工作流程3.在 Git 中提交的命令是什么&#xff1f;4.什么是 Git 中的“裸存储库”&#xff1f;5.Git 是用什么语言编写的&#xff1f;6.在Git中&#xff0c;你如何还原已经 push 并公开的提交&#xff1f;7.git pull 和 git fetch 有什么…

世微AP8105 低功耗PFM DC-DC变换器 升压芯片多种分装

概述 AP8105系列产品是一种效率、低纹波、工作频率高的PFM升压DC-DC变 换器。AP8105系列产品仅需要四个元器件&#xff0c;就可完成将低输入的电池电压变换升压到所需的工作电压&#xff0c;非常适合于便携式1&#xff5e;4节普通电池应用的场合。 电路采用了高性能、低功耗…

猫粮什么品牌好?业内人生分享五个口碑好质量好主食冻干猫粮牌子

随着养猫的人越来越多&#xff0c;铲屎官们对猫咪的饮食也越来越注重。除了猫粮&#xff0c;很多铲屎官还会给猫咪准备小零食。那么&#xff0c;猫咪是不是除了猫粮就没有其他可吃的了呢&#xff1f;答案当然不是。猫咪还有猫冻干、冻干猫粮、猫条等可以选择。每个铲屎官都希望…