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

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、二叉树的前序递归遍历

题解&#xff1a; 递归书写三要素&#xff1a; 1&#xff09;确定递归函数的参数和返回值。要确定每次递归所要用到的参数以及需要返回的值 2&#xff09;确定终止条件。操作系统也是用栈的方式实现递归&#xff0c;那么如果不写终止条件或者终止条件写的不对&#xff0c;都…...

youtube 1080 分辨率 下载方式

YouTube 1080p Video Downloader 这张图像代表了Autodesk Maya中一个名为rocket_body_MAT的材质的着色器网络。下面是对节点及其连接的细分: 节点 place2dTexture12: 该节点用于控制2D纹理在表面上的位置映射。输出: Out UVrocket_body2.jpg: 该节点代表一个纹理文件,具体是…...

计算机网络ppt和课后题总结(下)

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

测试基础12:测试用例设计方法-边界值分析

课程大纲 1、定义 经验发现&#xff0c;较多的错误往往发生在输入或输出范围的边界上&#xff0c;因为边界值是代码判断语句的点&#xff0c;一般容易出问题&#xff08;数值写错、多加或丢失等号、写错不等号方向…&#xff09;。所以增加对取值范围的边界数据的测试&#xff…...

AI大模型在健康睡眠监测中的深度融合与实践案例

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

【西瓜书】9.聚类

聚类任务是无监督学习的一种用于分类等其他任务的前驱过程&#xff0c;作为数据清洗&#xff0c;基于聚类结果训练分类模型 1.聚类性能度量&#xff08;有效性指标&#xff09; 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…...

使用jemalloc实现信号驱动的程序堆栈信息打印

使用jemalloc实现信号驱动的程序堆栈信息打印 本文介绍应用如何集成jemalloc&#xff0c;在接收到SIGUSR1信号10时打印程序的堆栈信息。 1. 编译jemalloc 首先&#xff0c;确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤&#xff1a; git c…...

树的4种遍历

目录 树的四种遍历方式的总结 1. 前序遍历&#xff08;Pre-order Traversal&#xff09; 2. 中序遍历&#xff08;In-order Traversal&#xff09; 3. 后序遍历&#xff08;Post-order Traversal&#xff09; 4. 层序遍历&#xff08;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&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…...

【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现

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

MapStruct的用法总结及示例

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

redis 05 复制 ,哨兵

01.redis的复制功能&#xff0c;使用命令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的世界里&#xff0c;存在了一些看起来还不错的模版引擎&#xff0c;比如poi-tl看起来就很不错&#xff0c;但是那是人家Javer们专属的&#xff0c;与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…...

MySQL中所有常见知识点汇总

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

Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践

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

远程访问及控制

SSH协议 是一种安全通道协议 对通信数据进行了加密处理&#xff0c;用于远程管理 OpenSSH(SSH由OpenSSH提供) 服务名称&#xff1a;sshd 服务端控制程序&#xff1a; /usr/sbin/sshd 服务端配置文件&#xff1a; /etc/ssh/sshd_config ssh存放的客户端的配置文件 ssh是服务端额…...

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46&#xff0c; Leetcode 416 需强化知识点 背包理论知识 题目 卡码 46. 携带研究材料 01 背包理论基础01 背包理论基础&#xff08;滚动数组&#xff09;01 背包 二维版本&#xff1a;dp[i][j] 表示从下标为[0-i]的物…...

html5实现个人网站源码

文章目录 1.设计来源1.1 网站首页页面1.2 个人工具页面1.3 个人日志页面1.4 个人相册页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/139564407 ht…...

【内存管理】内存布局

ARM32位系统的内存布局图 32位操作系统的内存布局很经典&#xff0c;很多书籍都是以32位系统为例子去讲解的。32位的系统可访问的地址空间为4GB&#xff0c;用户空间为1GB ~ 3GB&#xff0c;内核空间为3GB ~ 4GB。 为什么要划分为用户空间和内核空间呢&#xff1f; 一般处理器…...

软件试运行方案(Word)

软件试运行方案&#xff08;直接套用实际项目&#xff0c;原件获取通过本文末个人名片直接获取。&#xff09; 一、试运行目的 二、试运行的准备 三、试运行时间 四、试运行制度 五、试运行具体内容与要求...

Redis原理篇——哨兵机制

Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要&#xff0c;一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢&#xff1f; 2.哨兵工作原理 …...

web前端的MySQL:跨领域之旅的探索与困惑

web前端的MySQL&#xff1a;跨领域之旅的探索与困惑 在数字化浪潮的推动下&#xff0c;web前端与MySQL数据库似乎成为了两个不可或缺的领域。然而&#xff0c;当我们将这两者放在一起&#xff0c;尝试探索web前端与MySQL之间的交互与关联时&#xff0c;却发现这是一次充满困惑…...

Postgresql源码(135)生成执行计划——Var的调整set_plan_references

1 总结 set_plan_references主要有两个功能&#xff1a; 拉平&#xff1a;生成拉平后的RTE列表&#xff08;add_rtes_to_flat_rtable&#xff09;。调整&#xff1a;调整前每一层计划中varno的引用都是相对于本层RTE的偏移量。放在一个整体计划后&#xff0c;需要指向一个统一…...

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先&#xff0c;感谢老铁们一直以来对我的支持与厚爱&#xff0c;让我能坚持把Python魔法方法专栏更新完毕&#xff01; 其次&#xff0c;为了方便大家查阅&#xff0c;我将此专栏…...

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…...

Vue3 组合式 API:依赖注入(四)

provide() provide() 函数是用于依赖注入的一个关键部分。这个函数允许你在组件树中提供一个值或对象&#xff0c;使得任何子组件&#xff08;无论层级多深&#xff09;都能够通过 inject() 函数来访问这些值。 import { provide, ref } from vue; export default { setup(…...

Vue如何引入ElementUI并使用

Element UI详细介绍 Element UI是一个基于Vue 2.0的桌面端组件库&#xff0c;旨在构建简洁、快速的用户界面。由饿了么前端团队开发&#xff0c;提供丰富的组件和工具&#xff0c;帮助开发者快速构建高质量的Vue应用&#xff0c;并且以开放源代码的形式提供。 1. VueElementU…...

网站开发bbs/免费网站创建

http://blog.csdn.net/snsn1984/article/category/6223558...

温州 网站开发/商丘seo外包

滚动轴承内外圈的定位与固定的方法很多&#xff0c;下面介绍几种常用的方法。a)用轴用挡圈嵌在轴的沟槽内&#xff0c;主要用于轴向力不大及转速不高时&#xff1b;b)用螺钉固定的轴端挡圈紧固&#xff0c;可用于在高转速下承受大的轴向力&#xff0c;螺钉应有防松措施&#xf…...

wordpress外链缩略图/自有品牌如何推广

在linux下有两种访问ftp服务器的方式&#xff0c;一种是图形化界面操作&#xff0c;另一种方式就是用命令行的方式。 Ubuntu图形化界面访问ftp服务器 1、打开文件管理器&#xff0c;点击“其他位置” image.png2、在 连接服务器上 输入对应的ftp地址 image.png点击问号&#xf…...

阿里云 win wordpress 伪静态/吉林seo刷关键词排名优化

1. Proxy 的优势如下: 1. Proxy 可以直接监听对象而非属性&#xff1b; 2. Proxy 可以直接监听数组的变化&#xff1b; 3. Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、 has 等等是 Object.defineProperty 不具备的&#xff1b; 4. Proxy 返回的是一个…...

阿里巴巴怎么做不花钱的网站/深圳网站设计小程序

1.SyntaxError 语法错误 这个错误很常见,没什么好说的,根据系统提示好好检查代码 2.类型错误,常见的是字符串和数字直接拼接在一起name 小刘 age 17 print(name "今年" age) TypeError: must be str, not int 字符串只能和字符串拼接 3.索引错误list1[a,b,c] prin…...

分析网站做的好坏/网络广告营销案例

建一个表 t_hoteladvertise 有如下字段&#xff1a;ID 自动增长(主要)SortID INT (主要)Title NVARCHAR(50) 代码: CREATE proc sp_ehotel_DownAdvertiseID INTasDECLARE SortID intDECLARE TempSortID INTDECLARE TempID INTBEGIN TRANSELECT SortIDSortID from t_hote…...