ArrayList顺序表简单实现
一、创建MyArrayList框架
1.1 MyArrayList 类中实现 arr 数组
import java.util.Arrays;public class MyArrayList {private int[] arr;private int usesize;private static final int P = 10;public MyArrayList() {arr = new int[P];}
在 MyArrayList 类内创建 arr 数组,usesize 是 arr 数组内元素个数,定义常量 P 为10,并通过构造器将 arr 数组的初始内存赋值为10
1.2 实现 IList 接口
public interface IList {// 在数组末尾新增元素public void add(int data);// 判断数组是否已满boolean isFull();// 在 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 类 implements IList 接口后需要重写接口内的所有抽象类方法
1.3 MyArrayList 类 implements IList 接口
import java.util.Arrays;public class MyArrayList implements IList{private int[] arr;private int usesize;private static final int P = 10;public MyArrayList() {arr = new int[P];}@Overridepublic void add(int data) {}@Overridepublic boolean isFull() {return false;}@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 void add(int data); // 判断数组是否已满 boolean isFull(); // 在 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); //删除第一次出现的关键字key public void remove(int toRemove); // 获取顺序表长度 public int size() ; // 清空顺序表 public void clear(); // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的 public void display() ;
2.1 重写两种 add 方法
在数组末尾新增元素
2.1.1 第一种:
@Override public void add(int data) {if(isFull()) { // 在添加元素前使用 isFull 方法需判断数组是否存满grow(); // 如果已满,使用 grow 方法扩大数组}arr[usesize] = data;usesize++;}
2.1.1.1 isFull 方法
判断数组是否已满
@Override
public boolean isFull() { // 判满,返回 usesize 与 数组长度 的比较结果return usesize == this.arr.length;
}
2.1.1.2 grow 方法
private void grow() { // 使用 Arrays.copyOf 方法将数组的长度扩大为原来的两倍arr = Arrays.copyOf(arr, 2 * arr.length);
}
2.1.2 第二种:
在 pos 位置新增元素
@Override public void add(int pos, int data) {try{ // 使用 try...catch() 处理异常 check2(pos); // 使用 check2 方法判断 pos 位置是否合法,并抛出异常if(isFull()) { // 在添加元素前使用 isFull 方法需判断数组是否存满grow(); // 如果已满,使用 grow 方法扩大数组 }for (int i = usesize - 1; i >= pos ; i--) {arr[i + 1] = arr[i];}arr[pos] = data;usesize++;} catch (PosException e) { // 捕捉异常,打印异常信息System.out.println("插入位置有误");e.printStackTrace();}}
2.1.2.1 check2 方法:
private void check2(int pos) throws PosException{if(pos < 0 || pos > usesize ) { // check 方法中的 pos 不允许 = usesize throw new PosException("输入位置有误"); // 如果 pos不合法,抛出PosException} }
2.1.2.2 PosException 类:
public class PosException extends RuntimeException{ // 自定义 PosException 异常public PosException() {super();}public PosException(String message) {super(message);}
}
2.2 重写 contains 方法
判定是否包含某个元素
遍历 arr 数组,如果数组有与toFind相同的元素则返回 true ,否则返回 false
@Override public boolean contains(int toFind) {for (int i = 0; i < usesize; i++) { // 遍历数组if(toFind == arr[i]) { // 判断数组中是否有与 toFind 相同的元素 return true; // 如果有,返回true}}return false; // 遍历完数组后,没有与 toFind 相同的元素 } // 返回 false
2.3 重写 indexOf 方法
查找某个元素对应的位置
遍历数组,如果数组中存在与 toFind 相同的元素则返回数组下标,否则返回 -1
@Override public int indexOf(int toFind) {for (int i = 0; i < usesize; i++) { // 遍历数组if(toFind == arr[i]) { // 判断数组中是否有与 toFind 相同的元素 return i; // 如果有,返回该元素下标}}return -1; // 遍历完数组后,没有与 toFind 相同的元素 } // 返回 -1
2.4 重写 get 方法
获取 pos 位置的元素
@Override public int get(int pos) {try{ // 使用 try...catch() 处理异常 empty(); // 判断数组是否为空,为空则抛出异常EmptyExceptioncheck(pos); // 使用 check 方法判断 pos 位置是否合法,并抛出异常 return arr[pos]; // 返回 pos 位置的元素 } catch (PosException e) { // 捕捉异常,打印异常信息e.printStackTrace();} catch (EmptyException e) { // 捕捉异常,打印异常信息 e.printStackTrace();}return -1; }
2.4.1 empty 方法
private void empty() throws EmptyException{ // 判断 usesize 是否为零,为零抛出异常if(usesize == 0) { EmptyException throw new EmptyException("数组为空"); }
2.4.2 check 方法
private void check(int pos) throws PosException{ if(pos < 0 || pos >= usesize ) { // check 方法中的 pos 允许 = usesize throw new PosException("输入位置有误");// 如果 pos不合法,抛出PosException} }
2.4.3 EmptyException 类
public class EmptyException extends RuntimeException{ // 自定义 EmptyException 异常public EmptyException() {super();}public EmptyException(String message) {super(message);} }
2.5 重写 set 方法
给 pos 位置的元素设为 value
@Override public void set(int pos, int value) {try{empty(); // 判断数组是否为空,为空则抛出异常EmptyExceptioncheck(pos); // 使用 check 方法判断 pos 位置是否合法,并抛出异常 arr[pos] = value; // 将 pos 位置的值赋值为 value} catch (PosException e) { // 捕捉异常,打印异常信息e.printStackTrace();} catch (EmptyException e) { // 捕捉异常,打印异常信息 e.printStackTrace();} }
2.6 重写 remove 方法
删除第一次出现的关键字key
@Override public void remove(int toRemove) {try{empty(); // 判断数组是否为空,为空则抛出异常EmptyException int p = indexOf(toRemove); // 使用 indexOf 方法获取要删除元素的下标位置if(p == -1) { // 返回 -1 则数组中没有要删除的元素并结束return;}for (int j = p; j < usesize - 1; j++) { // 从要删除元素下标开始遍历数组arr[j] = arr[j + 1]; // 将数组中后一个元素赋值给前一个元素usesize--; // usesize 减一}} catch (EmptyException e) { // 捕捉异常,打印异常信息e.printStackTrace();} }
2.7 重写 size 方法
获取顺序表长度
@Override
public int size() {return usesize; // 返回 usesize
}
2.8 重写 clear 方法
清空顺序表
@Override
public void clear() {usesize = 0; // 将 usesize 赋值为零
}
2.9 重写 display 方法
打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
@Override
public void display() {for (int i = 0; i < usesize; i++) { // 遍历数组并打印数组信息System.out.print(arr[i] + " "); }
}
三、总结
顺序表是通过一段连续的存储单元来存储数据元素的,这种存储方式使得元素在物理位置上是相邻的,从而可以通过下标直接访问任意位置的元素。这种特性使得顺序表在访问元素时具有非常高的效率。顺序表的基本操作包括插入、删除、查找和修改等,通过不断练习和实践,我逐渐掌握了这些操作的实现技巧。顺序表的性能与其存储方式和操作实现密切相关。
我深入了解了顺序表的时间复杂度和空间复杂度分析方法。这有助于我在实际编程中根据需求选择合适的数据结构和算法,以达到最优的性能。学习顺序表不仅是为了理解其基本概念和特性,更重要的是将其应用于实际编程中。
我尝试使用顺序表解决了一些实际问题,如实现一个简单的通讯录管理系统、统计一个文本文件中不同单词的出现次数等。这些实践经历让我更加深入地理解了顺序表的实际应用和价值。
相关文章:
ArrayList顺序表简单实现
一、创建MyArrayList框架 1.1 MyArrayList 类中实现 arr 数组 import java.util.Arrays;public class MyArrayList {private int[] arr;private int usesize;private static final int P 10;public MyArrayList() {arr new int[P];} 在 MyArrayList 类内创建 arr 数组&…...

144、二叉树的前序递归遍历
题解: 递归书写三要素: 1)确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2)确定终止条件。操作系统也是用栈的方式实现递归,那么如果不写终止条件或者终止条件写的不对,都…...
youtube 1080 分辨率 下载方式
YouTube 1080p Video Downloader 这张图像代表了Autodesk Maya中一个名为rocket_body_MAT的材质的着色器网络。下面是对节点及其连接的细分: 节点 place2dTexture12: 该节点用于控制2D纹理在表面上的位置映射。输出: Out UVrocket_body2.jpg: 该节点代表一个纹理文件,具体是…...

计算机网络ppt和课后题总结(下)
常用端口总结 计算机网络中,端口是TCP/IP协议的一部分,用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字,范围从0到65535。通常,0到1023的端口被称为“熟知端口”或“系统端口”,它们被保留给一些标准…...

测试基础12:测试用例设计方法-边界值分析
课程大纲 1、定义 经验发现,较多的错误往往发生在输入或输出范围的边界上,因为边界值是代码判断语句的点,一般容易出问题(数值写错、多加或丢失等号、写错不等号方向…)。所以增加对取值范围的边界数据的测试ÿ…...

AI大模型在健康睡眠监测中的深度融合与实践案例
文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…...

【西瓜书】9.聚类
聚类任务是无监督学习的一种用于分类等其他任务的前驱过程,作为数据清洗,基于聚类结果训练分类模型 1.聚类性能度量(有效性指标) 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…...
使用jemalloc实现信号驱动的程序堆栈信息打印
使用jemalloc实现信号驱动的程序堆栈信息打印 本文介绍应用如何集成jemalloc,在接收到SIGUSR1信号10时打印程序的堆栈信息。 1. 编译jemalloc 首先,确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤: git c…...
树的4种遍历
目录 树的四种遍历方式的总结 1. 前序遍历(Pre-order Traversal) 2. 中序遍历(In-order Traversal) 3. 后序遍历(Post-order Traversal) 4. 层序遍历(Level-order Traversal 或 广度优先遍…...

深入探讨5种单例模式
文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览 以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。 …...
SPOOL
-----How to Pass UNIX Variable to SPOOL Command (Doc ID 1029440.6) setenv只有csh才有不行啊PROBLEM DESCRIPTION: You would like to put a file name in Unix and have SQL*Plus read that file name, instead of hardcoding it, because it will change.You want to pa…...

挑战绝对不可能:再证有长度不同的射线
黄小宁 一空间坐标系中有公共汽车A,A中各座位到司机处的距离h是随着座位的不同而不同的变数,例如5号座位到司机处的距离是h3,…h5,…。A移动了一段距离变为汽车B≌A,B中5号座位到司机处的距离h’h3,…h’h5…...

【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现
🔥 个人主页:空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着…...

MapStruct的用法总结及示例
MapStruct是一个代码生成器,它基于约定优于配置的原则,使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码,提高开发效率,并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…...

redis 05 复制 ,哨兵
01.redis的复制功能,使用命令slaveof 2. 2.1 2.2 3. 3.1 3.1.1 3.1.2 3.1.3 4 4.1 4.2 例子 5.1 这里是从客户端发出的指令 5.2 套接字就是socket 这里是和redis事件相关的知识 5.3 ping一下...

强大的.NET的word模版引擎NVeloDocx
在Javer的世界里,存在了一些看起来还不错的模版引擎,比如poi-tl看起来就很不错,但是那是人家Javer们专属的,与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…...

MySQL中所有常见知识点汇总
存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图: 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分: 连接器:负责跟客户端建立连 接、获取权限、维持和管理…...

Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践
背景 Apache Flink 是一个开源的流处理和批处理框架,具有高吞吐量、低延迟的流式引擎,支持事件时间处理和状态管理,以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎,支持 Java、Scala、Pytho…...

远程访问及控制
SSH协议 是一种安全通道协议 对通信数据进行了加密处理,用于远程管理 OpenSSH(SSH由OpenSSH提供) 服务名称:sshd 服务端控制程序: /usr/sbin/sshd 服务端配置文件: /etc/ssh/sshd_config ssh存放的客户端的配置文件 ssh是服务端额…...
【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416
【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416 需强化知识点 背包理论知识 题目 卡码 46. 携带研究材料 01 背包理论基础01 背包理论基础(滚动数组)01 背包 二维版本:dp[i][j] 表示从下标为[0-i]的物…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...