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

自定义实现简易版ArrayList

文章目录

  • 1.了解什么是顺序表
  • 2.实现哪些功能
  • 3.初始化ArrayList
  • 4.实现功能接口
    • 遍历顺序表
    • 判断顺序表是否已满
    • 添加元素
    • 指定下标添加元素
    • 自定义下标不合法异常
    • 判断顺序表是否为空
    • 查找指定元素是否存在
    • 查找指定元素返回下标
    • 获取指定下标的元素
    • 顺序表为空异常
    • 修改指定下标元素的值
    • 删除指定元素
    • 顺序表长度
    • 回收顺序表
  • 完整代码

1.了解什么是顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.实现哪些功能

对于一个顺序表来说
我们做的最多的也就是增删查改
则实现以下接口:

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 位置的元素设为 value  更新public void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove) ;// 获取顺序表长度public int size();// 清空顺序表public void clear() ;// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display();//判断是否已满boolean isFull();//判断是否为空public boolean isEmpty();
}

3.初始化ArrayList

usedSize为使用的长度
DEFAULT_SIZE = 10为默认顺序表的容量
两个构造方法
无参构造:顺序表默认大小为10;
有参构造:自定义顺序表大小;

public class MyList implements IList{public int[] elem ;public int usedSize;//0//顺序表的 默认大小public static final int DEFAULT_SIZE = 10;public MyList(){this.elem = new int[DEFAULT_SIZE];}public MyList(int capacity){this.elem = new int[capacity];}}

4.实现功能接口

遍历顺序表

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

判断顺序表是否已满

public boolean isFull(){return usedSize == elem.length;}

添加元素

checkCapacity()判断顺序表是否已满,如果已经满了则进行扩容
扩容为原来顺序表的两倍

 private void checkCapacity(){if(isFull()){elem = Arrays.copyOf(elem,elem.length*2);}}public void add(int data){checkCapacity();elem[this.usedSize] = data;this.usedSize++;}

指定下标添加元素

checkPosOnAdd()判断下标是否合法,如果不合法抛出异常

public void checkPosOnAdd(int pos) throws PosIllegality{if(pos < 0 || pos >usedSize){System.out.println("不合法!");throw new PosIllegality("获取指定下标的元素异常: "+pos);}}public void add(int pos, int data){try{checkPosOnAdd(pos);}catch (PosIllegality e){e.printStackTrace();return;}checkCapacity();for (int i = usedSize-1; i >= pos; i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;}

自定义下标不合法异常

package mylist;public class PosIllegality extends RuntimeException{public PosIllegality(String msg){super(msg);}
}

判断顺序表是否为空

public boolean isEmpty(){return usedSize == 0;}

查找指定元素是否存在

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

查找指定元素返回下标

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

获取指定下标的元素

public void checkPosOnGetAndSet(int pos) throws PosIllegality {if(pos < 0 || pos >= usedSize){System.out.println("不合法");throw new PosIllegality("获取指定下标的元素异常: "+pos);}}public int get(int pos) throws MyArrayListEmpty{checkPosOnGetAndSet(pos);if(isEmpty()){throw new MyArrayListEmpty("获取指定下标元素时" +"顺序表为空!");}return elem[pos];}

顺序表为空异常

package mylist;public class MyArrayListEmpty extends RuntimeException{public MyArrayListEmpty(String msg){super(msg);}
}

修改指定下标元素的值

public void set(int pos, int value){checkPosOnGetAndSet(pos);elem[pos] = value;}

删除指定元素

  public void remove(int toRemove){int index = indexOf(toRemove);if(index == -1){System.out.println("没有找到");return;}for (int i = index; i < usedSize - 1; i++) {elem[i] =elem[i+1];}usedSize--;}

顺序表长度

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

回收顺序表

 public void clear() {usedSize = 0;}

完整代码

在这里插入图片描述

package mylist;import java.util.Arrays;public class MyList implements IList{public int[] elem ;public int usedSize;//0//顺序表的 默认大小public static final int DEFAULT_SIZE = 10;public MyList(){this.elem = new int[DEFAULT_SIZE];}public MyList(int capacity){this.elem = new int[capacity];}public void display(){for (int i = 0; i < usedSize; i++) {System.out.print(elem[i]+" ");}System.out.println();}public boolean isFull(){return usedSize == elem.length;}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 checkPosOnAdd(int pos) throws PosIllegality{if(pos < 0 || pos >usedSize){System.out.println("不合法!");throw new PosIllegality("获取指定下标的元素异常: "+pos);}}public void add(int pos, int data){try{checkPosOnAdd(pos);}catch (PosIllegality e){e.printStackTrace();return;}checkCapacity();for (int i = usedSize-1; i >= pos; i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;}public boolean isEmpty(){return usedSize == 0;}public boolean contains(int toFind){if(isEmpty()){return false;}for (int i = 0; i < usedSize; i++) {if(elem[i] == toFind){return true;}}return false;}public int indexOf(int toFind){if(isEmpty()){return -1;}for (int i = 0; i < usedSize; i++) {if(elem[i] == toFind){return i;}}return -1;}public void checkPosOnGetAndSet(int pos) throws PosIllegality {if(pos < 0 || pos >= usedSize){System.out.println("不合法");throw new PosIllegality("获取指定下标的元素异常: "+pos);}}public int get(int pos) throws MyArrayListEmpty{checkPosOnGetAndSet(pos);if(isEmpty()){throw new MyArrayListEmpty("获取指定下标元素时" +"顺序表为空!");}return elem[pos];}public void set(int pos, int value){checkPosOnGetAndSet(pos);elem[pos] = value;}public void remove(int toRemove){int index = indexOf(toRemove);if(index == -1){System.out.println("没有找到");return;}for (int i = index; i < usedSize - 1; i++) {elem[i] =elem[i+1];}usedSize--;}public int size(){return this.usedSize;}public void clear() {usedSize = 0;}
}

相关文章:

自定义实现简易版ArrayList

文章目录 1.了解什么是顺序表2.实现哪些功能3.初始化ArrayList4.实现功能接口遍历顺序表判断顺序表是否已满添加元素指定下标添加元素自定义下标不合法异常判断顺序表是否为空查找指定元素是否存在查找指定元素返回下标获取指定下标的元素顺序表为空异常修改指定下标元素的值删…...

React中的Hooks--useReducer()

首先&#xff0c;useReducer是React提供的一个钩子函数&#xff0c;用于管理组件内部的状态。它可以接收一个reducer函数和初始状态&#xff0c;并返回一个包含状态和更新状态的函数的数组。 与之相反&#xff0c;Redux是一个独立的状态管理库&#xff0c;它可以在整个应用程序…...

DM@数理逻辑@命题公式及其赋值@真值表@公式分类

文章目录 abstract命题公式及其赋值命题常项命题变项 命题公式合式公式(命题公式)限定基本联结词的合适公式的定义合式公式中的0和1子公式 **公式的层次定义**分层加括号 命题公式的赋值和解释成真赋值成假赋值公式的书写规范括号的省略 真值表赋值方法数量构造真值表 公式分类…...

HTTP协议(超级详细)

HTTP协议介绍 基本介绍&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议&#xff0c;是基于TCP/IP通信协议来传送数据的&#xff0c;其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…...

leetcode做题笔记135. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回需要准备的…...

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式&#xff0c;即在数据库管理系统的层面中如何组织和管理数据&#xff0c;与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现&#xff0c;是不可见的&#xff0c;可以通过查询数据库数据字典了解逻…...

在 Python 中计算两个 GPS 点之间的距离

计算两个 GPS 点之间的距离是我们可以在 Python 框架内操作的地理和数学练习。 现在让我们看看如何使用 Python 执行此操作。 在 Python 中使用 Haversine 公式计算两个 GPS 点之间的距离 haversine 公式是用 Python 计算两个 GPS 点之间距离的一种简化方法,但它的计算是基于…...

影刀RPA解决WPS不存在的问题

问题阐述 明明电脑上已经安装了WPS&#xff0c;但影刀程序还是提示没有安装的问题 解决办法 1.打开WPS并关闭所有其他网页 2. 配置与修复 3.开始修复 出现这个框&#xff0c;就要关闭WPS&#xff0c;否则无法执行&#xff0c;关闭WPS不影响其修复 4.等待修复完成即可...

vue动态路由切换刷新保留历史路由搜索条件数据

最近有客户反映我们系统按条件查询完列表进入详情页后再返回列表页时页面没有展示他查询的那条数据&#xff0c;而是进入页面一贯会展示按无条件查询的数据&#xff0c;希望我们能对列表做查询缓存&#xff0c;那咱们就用keep-alive来实现一下 AppMain.vue include 属性绑定一个…...

免费:CAD批量转PDF工具,附下载地址

分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点&#xff01;重点&#xff01;重点&#xff01;自动将CAD的多张图纸一次性地、批量地转为PDF&#xff0c;或者打印。效果看下图&#xff1a; 适用环境&#xff1a; 32位系统 Auto…...

无涯教程-JavaScript - FACT函数

描述 The FACT function returns the factorial of a number. The factorial of a number is equal to 1&ast;2&ast;3&ast;...&ast; number. 语法 FACT (number)争论 Argument描述Required/OptionalNumberThe nonnegative number for which you want the f…...

UART 协议

文章目录 电气层硬件拓扑基本原理协议空闲位起始位数据位奇偶校验位无校验奇校验偶校验mark parityparity 停止位 波特率优缺点优点缺点 参考 UART(universal asynchronous receiver-transmitter) 通用异步收发器 分类特点导线2速度9600&#xff0c; 19200&#xff0c; 38400&…...

MySql中分割字符串

MySql中分割字符串 在MySql中分割字符串可以用到SUBSTRING_INDEX&#xff08;str, delim, count&#xff09; 参数解说       解释 str         需要拆分的字符串 delim         分隔符&#xff0c;通过某字符进行拆分 count          当 count 为正数&…...

Ubuntu 22.04安装过程

iso下载地址 Ubuntu Releases 1.进入引导菜单 选择Try or Install Ubuntu Server安装 2.选择安装语言 默认选择English 3.选择键盘布局 默认即可 4.选择安装服务器版本 最小化安装 5.配置网络 选择ipv4 选择自定义 DHCP也可 6.配置代理 有需要可以配置 这里跳过 7.软件源 …...

【算法|虚拟头节点|链表】移除链表元素

Leetcode203 移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xf…...

express静态路由匹配引发的404错误

最近有一个react项目&#xff0c;我用webpack打包&#xff0c;然后使用express作为webserver跑起来。 但是在运行的时候&#xff0c;就白屏了&#xff0c;看console原来是报了404错误 可是代码里面明明有路由定义&#xff0c;为什么还是报404错误呢&#xff1f; app.get("…...

VHOST-SCSI代码分析(4)VHOST KICK机制

在VIRTIO框架中虚拟机通知QEMU数据准备好是通过操作MMIO&#xff0c;在KVM中将操作分发到QEMU中&#xff0c;由QEMU中模拟对应的MMIO操作&#xff08;图中红色部分&#xff09;。 VHOST框架虚拟机通知HOST内核数据准备好也是通过MMIO操作&#xff0c;但在函数vhost_dev_enable_…...

Docker Volume(存储卷)

文章目录 Docker Volume(存储卷)1.什么是存储卷&#xff1f;2.为什么需要存储卷&#xff1f;3. 存储卷的分类1) 管理卷Volume方式一&#xff1a;Volume命令操作方式二&#xff1a; -v 或者--mount 指定方式三&#xff1a; Dockerfile 匿名卷小结Docker 卷生命周期Docker 卷共享…...

【毕设选题】opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…...

阿里云无影云电脑使用初体验:真的好用吗?

阿里云无影云电脑即无影云桌面&#xff0c;云桌面如何使用&#xff1f;云桌面购买后没有用户名和密码&#xff0c;先创建用户设置密码&#xff0c;才可以登录连接到云桌面。云桌面想要访问公网还需要开通互联网访问功能。阿里云百科来详细说下阿里云无影云电脑从购买、创建用户…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...