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=2
        arrayListV1.add(10, 0);
        arrayListV1.add(20, 1);
        arrayListV1.add(30, 2);
        
        //打印前  elements=[10,20,30,0,0]  size=3
        arrayListV1.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=3
        arrayListV1.add(40,0);
        //第五次添加前   elements=[40,10,20,30,0]  size=4
        arrayListV1.add(50,0);

        //打印  elements=[50,40,10,20,30]   size=5
        arrayListV1.print();//50 40 10 20 30

        //倒叙打印前  elements=[50,40,10,20,30]   size=5
        arrayListV1.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=4
        if (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=0
        size++;
    }
    //2、删除
    //3、修改
    //4、查询

    //辅助方法:新增数据时size++,移除数据时size--
    //是否为空
    public boolean isEmpty() {
        //第一次打印   size=3  此方法不成立  返回false
        //第二次打印   size=5  此方法不成立  返回false
        //倒叙打印     size=5  此方法不成立  返回false
        return 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=5
        return 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=5
        for (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=5
            System.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=5
        int 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=5
            System.out.println(this.elements[length]+"\t");
        }
        System.out.println();
    }

}

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

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

相关文章

Spring Cloud Gateway请求路径修改指南:详解ServerWebExchange的完美解决方案及代码示例

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

python实现贪吃蛇游戏

文章目录 1、项目说明2、项目预览3、开发必备4、贪吃蛇代码实现4.1、窗口和基本参数实现4.2、绘制背景4.3、绘制墙壁4.4、绘制贪吃蛇4.5、绘制食物4.6、实现长度信息显示4.7、定义游戏暂停界面4.8、定义贪吃蛇死亡界面4.9、实现贪吃蛇碰撞效果4.10、实现添加食物功能4.11、实现…

jQuery —— 自定义四位数验证弹框

在提交表单发送请求前&#xff0c;想要校验下&#xff0c;但不想用第三方插件&#xff0c;就自己写了个自定义数字校验码弹框&#xff0c;更稳定些&#xff0c;样式有点low&#xff0c;记录下。 没什么硬性要求的话&#xff0c;可以使用第三方插件&#xff0c;会方便许多样式也…

SQL学习笔记+MySQL+SQLyog工具教程

文章目录 1、前言2、SQL基本语言及其操作2.1、CREATE TABLE – 创建表2.2、DROP TABLE – 删除表2.3、INSERT – 插入数据2.4、SELECT – 查询数据2.5、SELECTDISTINCT – 去除重复值后查询数据2.6、SELECTWHERE – 条件过滤2.7、AND & OR – 运算符2.8、ORDER BY – 排序2…

科研院校和研究所都在用功率放大器做哪些实验

科研院校和研究所在科研工作中常常使用功率放大器进行实验。功率放大器是一种电子设备&#xff0c;其主要功能是将输入信号的功率增加到预定的输出功率水平&#xff0c;并保持信号的波形不失真。它在各个学科领域都有广泛的应用&#xff0c;包括通信、无线电、雷达、生物医学等…

Mac安装Nginx

一起学习 1、确认你的电脑是否安装homebrew&#xff0c;打开电脑终端 输入&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、确认homebrew是否安装成功&#xff0c;在终端输入&#xff1a; br…

Linux中使用HTTP协议进行网络通信的示例——你的“网络信使”

大家好&#xff0c;今天我们要聊聊在Linux中如何使用HTTP协议进行网络通信。听起来有点高大上&#xff0c;但其实并不难&#xff0c;让我们一起来看看&#xff01; 首先&#xff0c;我们要明白HTTP协议是什么。HTTP&#xff0c;全名为超文本传输协议&#xff08;Hypertext Tra…

操作系统课设-银行家算法VS2022

目录 1 目的和要求 2 银行家算法的数据结构 3 进程请求时的资源处理 4 安全性算法的设计思路 5 调试与分析 6 C语言源代码 7 心得体会 1 目的和要求 银行家算法是避免死锁的一种重要方法&#xff0c;能够有效的在资源分配的过程中&#xff0c;对系统的安全性进行检测。通…

搭建自动化 Web 页面性能检测系统 —— 设计篇

页面性能对于用户体验、用户留存有着重要影响&#xff0c;当页面加载时间过长时&#xff0c;往往会伴随着一部分用户的流失&#xff0c;也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素&#xff0c;也是一个网站口碑的重要评判标准。 一、名称解释 前端监控…

猫罐头哪个牌子好性价比高?五大性价比高的品牌推荐

很多猫奴担心猫咪天天吃干猫粮可能会导致营养不足&#xff0c;所以想给猫咪换换口味&#xff0c;改善一下饮食。这时&#xff0c;选择猫罐头是个不错的选择。不过&#xff0c;喂猫罐头也是有一些讲究的。 作为从业6年的宠物护理师来说&#xff0c;作为早在几年就开始接触猫罐头…

AI工具网站汇总——学习的好帮手

一、聊天AI 1.ChatGPT 地表最强AI聊天机器人 网址&#xff1a;https://chat.openai.com 2.Anthropic Anthropic发布的与ChatGPT竞争的聊天机器人 网址&#xff1a;https://www.anthropic.com 3.文心一言 百度全新知识增强大语言模型&#xff01;国产聊天机器人 网址&…

2023大湾区汽车创新大会暨IEEE自动驾驶国际标准研讨会成功举办

2023年12月15日-12月16日&#xff0c;由IEEE ADWG工作组主席孙栋博士、杨子江博士共同主持的2023大湾区汽车创新大会平行主题论坛-IEEE自动驾驶国际标准研讨会在深圳坪山成功举办。图灵奖获得者Joseph Sifakis、英伟达仿真生态总监German Ros、ASAM标准组织CEO Marius Dupuis、…

Seata:打造行业首个分布式事务产品

作者&#xff1a;季敏&#xff0c;阿里云分布式事务产品负责人、Seata 开源项目创始人 微服务架构下数据一致性的挑战 微服务开发的痛点 在 2019 年&#xff0c;我们基于 Dubbo Ecosystem Meetup&#xff0c;收集了 2000 多份关于“在微服务架构&#xff0c;哪些核心问题是开…

边缘计算有哪些常用场景?TSINGSEE边缘AI视频分析技术行业解决方案

随着ChatGPT生成式人工智能的爆发&#xff0c;AI技术在业界又掀起一波新浪潮。值得关注的是&#xff0c;边缘AI智能也在AI人工智能技术进步的基础上得到了快速发展。IDC跟踪报告数据显示&#xff0c;2021年我国的边缘计算服务器整体市场规模达到33.1亿美元&#xff0c;预计2020…

NFS原理详解

一、NFS介绍 1&#xff09;什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。 在本地的NFS客户端的机器看来&#xff0c;NFS服务器端共享的目录就好像自己的磁…

耿明雨履新并担任名誉台长

据悉&#xff0c;近日&#xff1a;经美国科罗拉多州国务卿审批&#xff0c;中国大陆知名人士、媒体人、慈善家耿明雨先生获科罗拉多州办公室证书批复&#xff0c;担任中国驻美国中央国际广播电视总台名誉台长、集团董事。

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…

一行注解,省却百行代码:深度解析@RequiredArgsConstructor的妙用

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 一行注解&#xff0c;省却百行代码&#xff1a;深度解析RequiredArgsConstructor的妙用 前言RequiredArgsConstructor 简介Lombok框架简介RequiredArgsConstructor 的实现原理注解参数及使用技巧项目中…

弧形导轨的类型及应用

弧形导轨又叫圆弧形导轨&#xff0c;滚轮弧形导轨&#xff0c;是通过V型滚轮在圆弧形V型导轨面上的滚动&#xff0c;实现圆周运动&#xff1b;在工业自动化中&#xff0c;有些应用需要弧线运动&#xff0c;或者两个相交或平行的直线运动&#xff0c;这些情况需要通过弧线运动连…

Python安装及配置

一、前置说明 Python的安装有两种方式&#xff1a;1. 访问Python官方网站下载安装&#xff1b;2. 使用Python的开源发行版进行安装。 Anaconda 是一个用于科学计算、数据分析和机器学习的开源发行版&#xff0c;它包含了许多常用的科学计算和数据分析库。Anaconda 不仅仅是 P…
最新文章