自定义实现简易版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()
首先,useReducer是React提供的一个钩子函数,用于管理组件内部的状态。它可以接收一个reducer函数和初始状态,并返回一个包含状态和更新状态的函数的数组。 与之相反,Redux是一个独立的状态管理库,它可以在整个应用程序…...
DM@数理逻辑@命题公式及其赋值@真值表@公式分类
文章目录 abstract命题公式及其赋值命题常项命题变项 命题公式合式公式(命题公式)限定基本联结词的合适公式的定义合式公式中的0和1子公式 **公式的层次定义**分层加括号 命题公式的赋值和解释成真赋值成假赋值公式的书写规范括号的省略 真值表赋值方法数量构造真值表 公式分类…...
HTTP协议(超级详细)
HTTP协议介绍 基本介绍: HTTP:超文本传输协议,是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议,是基于TCP/IP通信协议来传送数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现࿰…...
leetcode做题笔记135. 分发糖果
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的…...
Oracle数据库体系结构(三)_逻辑结构
Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式,即在数据库管理系统的层面中如何组织和管理数据,与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现,是不可见的,可以通过查询数据库数据字典了解逻…...
在 Python 中计算两个 GPS 点之间的距离
计算两个 GPS 点之间的距离是我们可以在 Python 框架内操作的地理和数学练习。 现在让我们看看如何使用 Python 执行此操作。 在 Python 中使用 Haversine 公式计算两个 GPS 点之间的距离 haversine 公式是用 Python 计算两个 GPS 点之间距离的一种简化方法,但它的计算是基于…...
影刀RPA解决WPS不存在的问题
问题阐述 明明电脑上已经安装了WPS,但影刀程序还是提示没有安装的问题 解决办法 1.打开WPS并关闭所有其他网页 2. 配置与修复 3.开始修复 出现这个框,就要关闭WPS,否则无法执行,关闭WPS不影响其修复 4.等待修复完成即可...
vue动态路由切换刷新保留历史路由搜索条件数据
最近有客户反映我们系统按条件查询完列表进入详情页后再返回列表页时页面没有展示他查询的那条数据,而是进入页面一贯会展示按无条件查询的数据,希望我们能对列表做查询缓存,那咱们就用keep-alive来实现一下 AppMain.vue include 属性绑定一个…...
免费:CAD批量转PDF工具,附下载地址
分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点!重点!重点!自动将CAD的多张图纸一次性地、批量地转为PDF,或者打印。效果看下图: 适用环境: 32位系统 Auto…...
无涯教程-JavaScript - FACT函数
描述 The FACT function returns the factorial of a number. The factorial of a number is equal to 1*2*3*...* number. 语法 FACT (number)争论 Argument描述Required/OptionalNumberThe nonnegative number for which you want the f…...
UART 协议
文章目录 电气层硬件拓扑基本原理协议空闲位起始位数据位奇偶校验位无校验奇校验偶校验mark parityparity 停止位 波特率优缺点优点缺点 参考 UART(universal asynchronous receiver-transmitter) 通用异步收发器 分类特点导线2速度9600, 19200, 38400&…...
MySql中分割字符串
MySql中分割字符串 在MySql中分割字符串可以用到SUBSTRING_INDEX(str, delim, count) 参数解说 解释 str 需要拆分的字符串 delim 分隔符,通过某字符进行拆分 count 当 count 为正数&…...
Ubuntu 22.04安装过程
iso下载地址 Ubuntu Releases 1.进入引导菜单 选择Try or Install Ubuntu Server安装 2.选择安装语言 默认选择English 3.选择键盘布局 默认即可 4.选择安装服务器版本 最小化安装 5.配置网络 选择ipv4 选择自定义 DHCP也可 6.配置代理 有需要可以配置 这里跳过 7.软件源 …...
【算法|虚拟头节点|链表】移除链表元素
Leetcode203 移除链表元素 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出…...
express静态路由匹配引发的404错误
最近有一个react项目,我用webpack打包,然后使用express作为webserver跑起来。 但是在运行的时候,就白屏了,看console原来是报了404错误 可是代码里面明明有路由定义,为什么还是报404错误呢? app.get("…...
VHOST-SCSI代码分析(4)VHOST KICK机制
在VIRTIO框架中虚拟机通知QEMU数据准备好是通过操作MMIO,在KVM中将操作分发到QEMU中,由QEMU中模拟对应的MMIO操作(图中红色部分)。 VHOST框架虚拟机通知HOST内核数据准备好也是通过MMIO操作,但在函数vhost_dev_enable_…...
Docker Volume(存储卷)
文章目录 Docker Volume(存储卷)1.什么是存储卷?2.为什么需要存储卷?3. 存储卷的分类1) 管理卷Volume方式一:Volume命令操作方式二: -v 或者--mount 指定方式三: Dockerfile 匿名卷小结Docker 卷生命周期Docker 卷共享…...
【毕设选题】opencv 图像识别 指纹识别 - python
文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往…...
阿里云无影云电脑使用初体验:真的好用吗?
阿里云无影云电脑即无影云桌面,云桌面如何使用?云桌面购买后没有用户名和密码,先创建用户设置密码,才可以登录连接到云桌面。云桌面想要访问公网还需要开通互联网访问功能。阿里云百科来详细说下阿里云无影云电脑从购买、创建用户…...
集成三相桥驱动的MCU:AiP8F7201电机控制方案解析
1. 项目概述:为什么我们需要“集成三相桥式驱动的微控制器”?在电机控制领域,尤其是消费电子、家电、工业自动化这些我们每天都会接触到的场景里,工程师们一直在和一堆“麻烦”作斗争。想象一下,你要设计一个驱动无刷直…...
2026年山东大学软件学院创新项目实训博客(五)
2026年山东大学软件学院创新项目实训博客(五) 一、工作进展 本阶段 Agent 架构模块的核心推进是将父级编排从「单次补全加强制工具调用」升级为有界多轮循环,并同步完成系统提示词的多步能力声明、意图分类器的域关键词防误路由、以及 SSE 事…...
IDM激活脚本:3分钟解锁完整版下载功能的终极指南
IDM激活脚本:3分钟解锁完整版下载功能的终极指南 【免费下载链接】IDM-Activation-Script-ZH IDM激活脚本汉化版 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script-ZH 还在为Internet Download Manager(IDM)的30天…...
会议录播堆积如山?用这款AI工具3分钟自动生成会议纪要
一个很普遍的职场痛点:每周开3-4个会,录播存了一堆,但从来没有整理过。 不是不想整理,是整理一小时的会议录像至少要40分钟——要从头拉一遍、要标重点、要区分谁说了什么、要提炼行动项。忙的时候根本没时间干这个。 结果就是&…...
华硕游侠2-RX键盘多功能滚轮自定义M失效的解决方案
新买了一块游侠2 rx键盘,想着用自定义滚轮方便打开常用程序,但是发现在Armoury Crate中设置后不起作用,网上解决方案伤筋动骨,得不偿失,有一定风险。 经测试,自定义滚轮能正常执行宏定义,只是对…...
基于Hive的淘宝用户购物行为数据分析及可视化
第1章 绪论1.1 课题背景互联网技术迅猛发展,电子商务平台聚集了庞大的用户数据,其中包含着大量的用户行为信息以及消费习惯。淘宝是中国最大的电子商务平台之一,其用户购物行为数据具有很高的研究价值。在大数据的背景下,怎样对数…...
科研绘图避坑指南:手把手教你用Cytoscape处理String PPI数据(TSV文件导入、节点筛选与双环图制作)
科研绘图避坑指南:Cytoscape实战PPI网络分析与双环图设计 在生物医学研究中,蛋白互作网络(PPI)可视化是揭示分子机制的重要工具。许多研究者在使用String数据库和Cytoscape软件时会遇到数据导入失败、节点筛选困难、图形美化耗时等问题。本文将针对这些痛…...
大模型KV缓存量化技术:原理、优化与实践
1. KV缓存量化技术背景解析在Transformer架构的大语言模型(LLM)推理过程中,注意力机制的计算复杂度与序列长度呈平方关系增长。为优化这一过程,现代LLM服务系统普遍采用KV缓存(Key-Value Cache)技术,将注意力层计算过的键值对存储在内存中供后…...
互联网大厂 Java 求职面试:从 Spring Boot 到微服务与云原生的技术探讨
互联网大厂 Java 求职面试:从 Spring Boot 到微服务与云原生的技术探讨 场景介绍:在一家知名互联网大厂的面试现场,面试官是一位严肃的技术专家,而候选人燕双非则是一位幽默风趣的程序员。面试官准备了一系列问题,涵盖…...
ToyKind-World:基于Python的ECS架构多智能体模拟框架构建指南
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“ToyKind-World”。光看这个名字,你可能会觉得有点抽象,是玩具世界?还是某种模拟器?点进去一看,发现它其实是一个用Python构建的、高度可配…...
