Java数据结构-模拟实现ArrayList

MyArrayList顺序结构:

接口和MyArrayList重写接口

接口

接口中的方法是很多类通用的,所以可以写到接口中

public interface IList {public void add(int data) ;// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind) ;// 查找某个元素对应的位置public int indexOf(int toFind) ;// 获取 pos 位置的元素public int get(int pos) ;// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size() ;// 清空顺序表public void clear() ;// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display();}

MyArrayList的实现

首先需要重写IList接口

后续还会添加方法到接口

public class MyArrayList implements IList{@Overridepublic void add(int data) {}@Overridepublic void add(int pos, int data) {}@Overridepublic boolean contains(int toFind) {return false;}@Overridepublic int indexOf(int toFind) {return 0;}@Overridepublic int get(int pos) {return 0;}@Overridepublic void set(int pos, int value) {}@Overridepublic void remove(int toRemove) {}@Overridepublic int size() {return 0;}@Overridepublic void clear() {}@Overridepublic void display() {}
}
基本要素:

顺序接口中,在存储元素的时候,需要有一个数组自己来创建(定义数组 给数组分配内存 数组初始化)需要一个记录数组中元素的个数-计数器

public int[] elem;public int usedSize;public static final int DEFAULT_SIZE = 10;public MyArrayList(){this.elem = new int[DEFAULT_SIZE];}public MyArrayList(int capacity){this.elem = new int[capacity];}
遍历并打印

打印的个数是有计数器决定的

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

插入的时候需要检查容量是否满,然后是否扩容

所以可以单独写一个方法来实现检查慢不慢和要不要扩容

private void checkCapacity(){if(isFull()){elem = Arrays.copyOf(elem,elem.length*2);}}

 

//不是用户要用到的封装起来
尾插数据元素
 public void add(int data) {checkCapacity();elem[this.usedSize] = data;this.usedSize++;}
根据下表插入

插入需要检查下标是否异常 所以选哟写一个异常类 

在插入的过程中

  public void add(int pos, int data) {try {checkPosOnAdd(pos);}catch (PosIllegality e){e.printStackTrace();//异常就不用检查容量了return;}checkCapacity();//1.从最后一个元素往后移 2. 当i到 pos 位置时结束for (int i = this.usedSize - 1; i >= pos ; i--) {elem[i+1] = elem[i];}//插入data元素elem[pos] = data;//usedSize++this.usedSize++;}
检查下标 
   private void checkPosOnAdd(int pos)throws PosIllegality{if(pos < 0 || pos > this.usedSize){System.out.println("不符合法");throw new PosIllegality("插入元素下标异常" + pos);}}
下标异常类

public class PosIllegality extends RuntimeException{public PosIllegality(String msg){super(msg);}
}
检查是否包含某个元素

首先需要判断数组是不是空 

 public boolean contains(int toFind) {if(isEmpty()){return false;}for (int i = 0; i < this.usedSize; i++) {if (elem[i] == toFind){return true;}}return false;}
判断是否为满或者空
 public boolean isFull(){return this.usedSize == elem.length;}
   public boolean isEmpty(){return this.usedSize == 0;}
查找某个元素对应的位置
   public int indexOf(int toFind) {if(isEmpty()){return -1;}for (int i = 0; i < this.usedSize; i++) {if (elem[i] == toFind){return i;}}return -1;}
获取pos位置的值
  public int get(int pos) {checkPosOnGetAndSet(pos);if(isEmpty()){throw new MyArrayEmpty("获取下标元素" + "顺序表为空");}return elem[pos];}

其中也要检查为空,但返回的时候必须抛异常,以免返回数字认为是该下标的值

Get和Set检查下标合法性
private void checkPosOnGetAndSet(int pos)throws PosIllegality{if(pos < 0 || pos >= this.usedSize){System.out.println("不符合法");throw new PosIllegality("获取元素下标异常" + pos);}}
Set和Get为空时异常类 
public class MyArrayEmpty extends RuntimeException{public MyArrayEmpty(String msg){super(msg);}
}
更新pos的值
 public void set(int pos, int value) {checkPosOnGetAndSet(pos);elem[pos] = value;}
 删除某一个值

先判断一下是否有该数值,如果没有就直接返回

    @Overridepublic void remove(int toRemove) {int index = indexOf(toRemove);if(index == -1){System.out.println("没有这个数字");return;}for (int i = toRemove; i < this.usedSize - 1; i++){elem[i] = elem[i+1];}this.usedSize--;}
 返回元素个数
  @Overridepublic int size() {return this.usedSize;}
清空数组
public void clear() {this.usedSize = 0;}

ArrayListd底层代码分析

 

for each遍历list的变量

 使用迭代器

 

 

ArrayList的优缺点 

 

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

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

相关文章

踏上R语言之旅:解锁数据世界的神秘密码(三)

多元相关与回归分析及R使用 文章目录 多元相关与回归分析及R使用一.变量间的关系分析1.两变量线性相关系数的计算2.相关系数的假设检验 二.一元线性回归分析的R计算三、回归系数的假设检验总结 一.变量间的关系分析 变量间的关系及分析方法如下&#xff1a; 1.两变量线性相关…

LeetCode 727. 菱形

输入一个奇数 n n n&#xff0c;输出一个由 * 构成的 n n n阶实心菱形。 输入格式 一个奇数 n n n。 输出格式 输出一个由 * 构成的 n n n阶实心菱形。 具体格式参照输出样例。 数据范围 1 ≤ n ≤ 99 1≤n≤99 1≤n≤99 输入样例&#xff1a; 5输出样例&#xff1a; *…

JAVA的多态

在Java中&#xff0c;多态&#xff08;Polymorphism&#xff09;是面向对象编程的三大特性之一&#xff0c;它允许一个引用变量在运行时引用不同类的对象&#xff0c;并根据实际对象的类型来执行对应的方法。多态的存在增加了代码的灵活性和可扩展性。 多态的实现通常依赖于以下…

一文掌握python上下文管理器(with语句)

目录 一、上下文管理协议 二、with 语句 三、自定义上下文管理器 四、生成器上下文管理器 五、几个常用例子 1、自动关闭网络连接 2、临时更改目录 3、数据库事务管理 4、计时器上下文管理器 5、日志记录上下文管理器 6、资源锁定上下文管理器 7、临时修改环境变量…

windows远程访问树莓派ubuntu22.04 桌面 - NoMachine

通过nomachine 实现 windows 安装 nomachine 下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/10rGBREs-AnwRz7D7QbLQ1A?pwd8651 提取码&#xff1a;8651 安装&#xff1a;下一步 下一步 使用&#xff1a; 下一步 下一步 ubuntu 安装 nomachine服务 下载&#…

Java基础知识总结(81)

JUC容器 JUC基于非阻塞算法&#xff08;Lock Free 无锁编程&#xff09;提供了一组高并发的List、Set、Queue、Map容器。 JUC高并发容器是基于非阻塞算法实现的容器类&#xff0c;无锁编程算法主要通过CAS&#xff08;Compare And Swap&#xff09;volatile的组合实现&#x…

【C++程序员的自我修炼】string 库中常见的用法 (一)

唤起一天明月照我满怀冰雪浩荡百川流鲸饮未吞海 剑气已横秋 目录 string 库的简介 string 的一些小操作 构造函数的使用 拷贝构造的常规使用 指定拷贝内容的拷贝构造 拷贝字符串开始的前 n 个字符 用 n 个字符初始化 计算字符串的长度 string 的三种遍历方式 常规的for循环 op…

利用大型语言模型提升数字产品创新:提示,微调,检索增强生成和代理的应用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Linux基础part-6

一、Shell编程理论和运用 1、程序的编程风格和执行模式 编程风格&#xff08;Programming Style&#xff09; 过程式编程&#xff1a;以指令为中心&#xff0c;来进行写程序&#xff0c;数据服务于指令。&#xff08;bash shell) C 以指令为中心&#xff0c;程序的逻辑由一系…

「笔试刷题」:字母收集

一、题目 描述 有一个 &#x1d45b;∗&#x1d45a; 的矩形方阵&#xff0c;每个格子上面写了一个小写字母。 小红站在矩形的左上角&#xff0c;她每次可以向右或者向下走&#xff0c;走到某个格子上就可以收集这个格子的字母。 小红非常喜欢 "love" 这四个字母。…

FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流

OBS是一个开源的直播录制软件&#xff0c;英文全称叫做Open Broadcaster Software&#xff0c;广泛用于视频录制、实时直播等领域。OBS不但开源&#xff0c;而且跨平台&#xff0c;兼容Windows、Mac OS、Linux等操作系统。 OBS的官网是https://obsproject.com/&#xff0c;录制…

【报错处理】ib_write_bw执行遇到Couldn‘t listen to port 18515原因与解决办法?

要点 要点&#xff1a; ib默认使用18515端口 相关命令&#xff1a; netstat -tuln | grep 18515 ib_write_bw --help |grep port# server ib_write_bw --ib-devmlx5_1 --port88990 # client ib_write_bw --ib-devmlx5_0 1.1.1.1 --port88990现象&#xff1a; 根因&#xff…

为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用

本文介绍了某省妇幼健康管理系统的建设和数据库架构优化的过程。原有的数据库架构使用了 StarRocks 作为分析层&#xff0c;但随着业务的发展&#xff0c;这套架构暴露出诸多痛点&#xff0c;不再适应妇幼业务的需求。为解决这些问题&#xff0c;该系统选择了将原有架构中的 St…

OBSERVER(观察者)-- 对象行为模式

意图&#xff1a; 定义对象间地一种一对多地依赖关系&#xff0c;当一个对象地状态发生改变时&#xff0c;所有对于依赖于它的对象都得到通知并被自动更新。 别名&#xff1a; 依赖(Dependents), 发布-订阅(Publish-Subsribe) 动机&#xff1a; 将一个系统分割成一系列相互协…

使用Python及R语言绘制简易数据分析报告

Pytohn实现 在python中有很多包可以实现绘制数据分析报告的功能&#xff0c;推荐两个较为方便的包&#xff1a;pandas-profiling 和 sweetviz 。 使用 pandas-profiling 包&#xff08;功能全面&#xff09; 这个包的个别依赖包与机器学习的 sklearn 包的依赖包存在版本冲突&a…

【C++中的模板】

和你有关&#xff0c;观后无感................................................................................................................. 目录 前言 一、【模板的引入和介绍】 1、泛型编程 2、【模板的介绍】 二、【 函数模板】 2.1【模函数板的介绍】 1.…

修改word文件的创作者方法有哪些?如何修改文档的作者 这两个方法你一定要知道

在数字化时代&#xff0c;文件创作者的信息往往嵌入在文件的元数据中&#xff0c;这些元数据包括创作者的姓名、创建日期以及其他相关信息。然而&#xff0c;有时候我们可能需要修改这些创作者信息&#xff0c;出于隐私保护、版权调整或者其他实际需求。那么&#xff0c;有没有…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件&#xff1a;sql-analysis 一、背景二、源码简析三、总结 地址&#xff1a;https://github.com/jd-opensource/sql-analysis 一、背景 开发中&#xff0c;无疑会遇到慢SQL问题&#xff0c;而常见的处理思路都是等上线&#xff0c;然后由监控报警之后再去定位对应…

vue 前端读取Excel文件并解析

前端读取Excel文件并解析 前端如何解释Excel呢 平时项目中对于Excel的导入解析是很常见的功能&#xff0c;一般都是放在后端执行&#xff1b;但是也有特殊的情况&#xff0c;偶尔也有要求说前端执行解析&#xff0c;判空&#xff0c;校验等&#xff0c;最后组装成后端接口想要的…

【大数据】利用 Apache Ranger 管理 Amazon EMR 中的数据权限

利用 Apache Ranger 管理 Amazon EMR 中的数据权限 1.需求背景简介2.系统方案架构图3.主要服务和组件简介3.1 Amazon EMR3.2 Simple Active Directory3.3 Apache Ranger 4.部署步骤4.1 部署 Simple AD 服务4.2 部署 Apache Ranger4.3 部署 Amazon EMR4.4 在 Amazon EMR 的主节点…