当前位置: 首页 > news >正文

【数据结构与算法】ArrayList的模拟实现

⛵⛵hello,进来的小伙伴们,你们好呐!

🚀🚀系列专栏:【数据结构与算法】

🍼🍼作者简介:一名大三在读的科班Java小白,星夜漫长,你我同行!

🌯🌯本篇内容:初始ArrayList与顺序表,简单了解ArrayList的基本用法,入门顺序表!

✈️✈️码云存放仓库gitee:Java初阶数据结构代码存放!

4fb122cad6384710a75aa607f95dd969.jpeg

🍅🍅目录

 一、ArrayList的模拟实现

 2、类MyArrayList

3、打印顺序表

4、新增元素,默认在数组后面新增

 5、在pos位置新增元素

6、判定是否包含某个元素

7、查找某个元素对应的位置

8、获取pos位置的元素

8、给pos位置的元素改为value

9、删除第一次出现的元素key

10、获取顺序表长度

11、清空顺序表


 一、ArrayList的模拟实现

接着上上篇……博客,我们已经介绍了ArrayList的基本使用方法,也给大家演示了ArrayList的遍历方法,那么最近博主是一直在更新数据结构的博客,所以才想起来还有ArrayList的模拟实现没有给大家写,哈哈,借助国庆节的活动,今天就给大家带来的就是ArrayList的模拟实现,忘记的同学可以去翻翻该专栏的ArrayList与顺序表这篇博客!

1、首先在我们的idea里面新建一个包Arraylist,我希望大家可以这样把同一类型的知识点写在一个包里面,这样非常方便,也符合了我们java中包的定义使用。

ce2d1fed842847c88b7243de664b5bec.png

主函数代码:

    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.display();
        myArrayList.display();

 2、类MyArrayList

    private int[] elem;//数组
    private int usedSize;//记录有效的数据的个数
    private static final int DEFAULT_SIZE = 10;

    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }

3、打印顺序表

    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }

运行结果:

9f75ccaf7da9457084dc67166c0ca3d1.png

4、新增元素,默认在数组后面新增

 public void add(int data) {
        //1. 检查当前的顺序表是不是满了?
        if(isFull()) {
            //2. 如果满了 就要进行扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //3.
        this.elem[this.usedSize] = data;
        //4.
        this.usedSize++;
    }
    public boolean isFull() {
        /*if(size() >= this.elem.length){
            return true;
        }
        return false;*/
        return size() >= this.elem.length;
    }

 5、在pos位置新增元素

   /**
     * 在 pos 位置新增元素
     * 如果pos下标不合法,那么就会抛出一个 PosWrongfulException
     */

    public void add(int pos, int data) throws PosWrongfulException{
        if(isFull()) {
            System.out.println("满了");
            this.elem =
                    Arrays.copyOf(this.elem,2*this.elem.length);
        }
        if(pos < 0 || pos > this.usedSize) {
            System.out.println("pos位置不合法!");
            throw new PosWrongfulException("pos位置不合法");
        }
        //pos一定是合法的
        //1. 开始挪动数据
        for (int i = this.usedSize-1; i >= pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //2.插入数据
        this.elem[pos] = data;
        //3. usedSize++
        this.usedSize++;
    }

自定义一个异常:PosWrongfulException

public class PosWrongfulException extends RuntimeException{
    public PosWrongfulException() {
    }

    public PosWrongfulException(String message) {
        super(message);
    }
}

自定义异常: EmptyException

public class EmptyException extends RuntimeException{
    public EmptyException() {
    }

    public EmptyException(String message) {
        super(message);
    }
}

6、判定是否包含某个元素

    public boolean contains(int toFind) {
        for (int i = 0; i < this.size(); i++) {
            if(this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

7、查找某个元素对应的位置

    public int indexOf(int toFind) {
        for (int i = 0; i < this.size(); i++) {
            if(this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

8、获取pos位置的元素

  public int get(int pos) {
        if(isEmpty()) {
            throw new EmptyException("当前顺序表为空!");
        }
        if(pos < 0 || pos >= this.usedSize) {
            throw new PosWrongfulException("get获取元素的时候,pos不合法异常!");
        }
        return this.elem[pos];
    }
    public boolean isEmpty() {
        return size() == 0;
    }

8、给pos位置的元素改为value

   public void set(int pos, int value) {
        if(isEmpty()) {
            throw new EmptyException("当前顺序表为空!");
        }
        if(pos < 0 || pos >= this.usedSize) {
            throw new PosWrongfulException("set获取元素的时候,pos不合法异常!");
        }

        this.elem[pos] = value;
    }

9、删除第一次出现的元素key

 public void remove(int key) {
        if(isEmpty()) {
            throw new EmptyException("顺序表为空!");
        }
        int index = this.indexOf(key);
        if(index == -1) {
            System.out.println("没有这个数字");
            return;
        }
        for (int i = index; i < size()-1; i++) {
            this.elem[i] = this.elem[i+1];
        }
        this.usedSize--;
    }

10、获取顺序表长度

    public int size() {
        return this.usedSize;
    }

11、清空顺序表

   public void clear() {
        /*for (int i = 0; i < size(); i++) {
            this.elem[i] = null;
        }
        this.usedSize=0;*/
        this.usedSize=0;
    }

🍱🍱OK,那么以上就是ArrayList的个人实现代码了,当然对于顺序表还是比较简单的结构,大家在学习数据结构的过程中一定是先深入理解,从底层出发,个人实现何种顺序表,这样的学习效果才是最棒的,那么最后祝大家"国庆快乐鸭!"🍺🍺

1d3301eaaae6417baebd9ff6957facf2.jpeg

相关文章:

  • Spring5源码之IOC的Bean管理之xml
  • DHCP 服务
  • [架构之路-20]:目标系统 - 硬件平台 - 嵌入式系统硬件电路基础:架构、设计流程、总线、外设、基本电路、编码
  • 关系代数 运算
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • python使用cv2库实现图像的读取处理显示和保存
  • 二道题:分组顺序向下填充 和 标注数据整理
  • 节日网页HTML代码 学生网页课程设计期末作业下载 清明节大学生网页设计制作成品下载 DW节日网页作业代码下载
  • 生命在于折腾——某国外cms代码审计
  • 『从零开始学小程序』媒体组件audio组件
  • [HJ73 计算日期到天数转换]
  • FastDFS数据迁移
  • Java Web 10 JSP 10.3 JSP 原理
  • extern “C“
  • 基于ARM9平台的网络可视电话设计
  • Javascript编码规范
  • Laravel 菜鸟晋级之路
  • 工作手记之html2canvas使用概述
  • 聊聊flink的TableFactory
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用 QuickBI 搭建酷炫可视化分析
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT(TCP网络编程-服务端)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • %@ page import=%的用法
  • (C#)一个最简单的链表类
  • (二)Linux——Linux常用指令
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)EOS中账户、钱包和密钥的关系
  • (转载)利用webkit抓取动态网页和链接
  • ***监测系统的构建(chkrootkit )
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net 7 上传文件踩坑
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 设计一套高性能的弱事件机制
  • .net中我喜欢的两种验证码
  • ??javascript里的变量问题
  • @Autowired自动装配
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [100天算法】-二叉树剪枝(day 48)
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [ARC066F]Contest with Drinks Hard
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#]winform部署yolov5-onnx模型
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [CF407E]k-d-sequence