JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言

笔者开始学习数据结构了,虽然笔者已经会用了,不管是C++ 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了,不用和我客气!

前置知识-什么是数据结构

说的简短一些,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

前置知识-什么是顺序表?

答:说白了就是一个动态数组

官方概念如下:

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

顺序表如何实现?

如图

一个接口,一个类负责实现方法,一个Main类来调用,一个我们自定义的异常来处理各种问题!!!

顺序表的接口

package LIST;public interface list
{// 新增元素,默认在数组最后新增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();public boolean isfull();// 负责检查顺序表是否满了public boolean isEmpty();//负责检查顺序表是否是空的
}

每个结构具体需要实现什么功能,笔者已经写在注释里了,作为一个"动态数组",也就是"CURD"而已.

没什么难的,但是不借助外力的手搓还是有点难的.

自定义异常   

比起使用现有的异常,我们还是自己定义一个方便一些

package LIST;public class POSIllegal extends RuntimeException
{public POSIllegal(String message){super(message);}
}

顺序表的功能实现

前置功能

@Override
public boolean isfull()
// 检测顺序表是否以及满了
{if(usedsize==myarray.length)return true;elsereturn  false;
}@Overridepublic boolean isEmpty(){return this.usedsize==0?true:false;}

 设置这两个功能说实话有的没必要,但是一定要考虑到严谨,这必须加上来,以防止越界,也可以引出如果使用自定义异常!

通过这两个重写方法,也可以衍生出一个被封装的方法

private  void checkcap()
{if(isfull())// 检测一下{myarray = Arrays.copyOf(myarray,myarray.length*2);// 扩容(两倍)}
}

 为什么我们这里用private?因为你作为使用者,你压根用不着.这也是一种没什么必要的严谨性吧.早点养成习惯也不是什么坏事.

部分核心功能

接下来来到我们的核心功能了,我们一个个来看

增加

    @Overridepublic void add(int data){checkcap();this.myarray[this.usedsize] =data;this.usedsize++;}

在指定位置增加

    private  void checkPos (int pos)   throws POSIllegal{if(pos<0||pos>this.usedsize){throw  new POSIllegal("pos不合法,你的pos是 :"+pos);}}   @Overridepublic void add(int pos, int data){checkcap();try {checkPos(pos);}catch (POSIllegal e){e.printStackTrace();System.out.println("下标不符合规定");return ;}for(int i=this.usedsize-1;i>=pos;i--){this.myarray[i+1]=this.myarray[i];}this.myarray[pos]=data;this.usedsize++;}

我们首先,看看,需不需要扩容,不需要,好的,再看看有没有异常,有的话,抛出异常,让catch接收,然后return,没有异常,那就更好了,直接就可以扩容了,注意下标的边界就好了,没有难度.

得到指定位置的数据

    @Overridepublic int get(int pos){try {return this.myarray[pos];} catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();System.out.println("越界了,数组只有"+myarray.length+"这么大");System.out.println("请你看看自己是不是选择了负数或者大于数组大小的数");return  pos;}}

 这里我们用了官方的异常,有个对比参考.

 在指定位置替换元素

    private  void checkPosSet (int pos)   throws POSIllegal{if(pos<0||pos>=this.usedsize){throw  new POSIllegal("pos不合法,你的pos是 :"+pos);}}@Overridepublic void set(int pos, int value){try {checkPosSet(pos);}catch (POSIllegal e){e.printStackTrace();return ;}this.myarray[pos]=value;}

注意注意,这里和增加不同了,增加是可以在顺序表增加的,但是替换是不能在结尾替换的,因为你没有元素,你怎么替换?你告诉我.

获取指定位置元素

    @Overridepublic int indexOf(int toFind){if(isEmpty()){return -1;}else{for(int i=0;i<this.usedsize;i++){if(this.myarray[i]==toFind)return i;}}return -1;}

 这里我就没用try catch 写法了

移除第一次出现的某元素

    @Overridepublic void remove(int toRemove){int idx=indexOf(toRemove);if(idx==-1){System.out.println("没有这个数字哦");}else{for(int i=idx;i<usedsize-1;i++){this.myarray[i]=this.myarray[i+1];}usedsize--;}}

其他功能

还有两个其他功能

清空,还有获得usedsize

    @Overridepublic int size(){return this.usedsize;}@Overridepublic void clear(){if(isEmpty()){System.out.println("没法清理,顺序表是空的");return ;}for(int i=0;i<this.usedsize;i++){this.myarray[i]=0;}display();System.out.println("清空完成");}

主函数

package LIST;
public class Main
{public static void main(String[] args) {Mylist mylist=new Mylist();mylist.add(0,2);mylist.add(1,2);mylist.add(2,2);mylist.add(3,2);mylist.add(1,23);mylist.add(3,2);mylist.add(3,2);mylist.add(3,2);mylist.display();mylist.set(5,2324);mylist.set(7,232);mylist.add(543,242);System.out.println(mylist.size());mylist.display();mylist. clear();}
}

可以进行各种调用

也会显示异常出来

效果如图!!!!!!!

完整代码

完整代码如下

package LIST;public interface list
{// 新增元素,默认在数组最后新增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();public boolean isfull();// 负责检查顺序表是否满了public boolean isEmpty();//负责检查顺序表是否是空的
}
package LIST;
import java.util.Arrays;
public class Mylist implements list
{int [] myarray;public  static  final int number= 5;int  usedsize=0;public Mylist(){this.myarray = new int[number];}
private  void checkcap()
{if(isfull())// 检测一下{myarray = Arrays.copyOf(myarray,myarray.length*2);// 扩容(两倍)}
}
@Override
public boolean isfull()
// 检测顺序表是否以及满了
{if(usedsize==myarray.length)return true;elsereturn  false;
}@Overridepublic boolean isEmpty(){return this.usedsize==0?true:false;}private  void checkPos (int pos)   throws POSIllegal{if(pos<0||pos>this.usedsize){throw  new POSIllegal("pos不合法,你的pos是 :"+pos);}}private  void checkPosSet (int pos)   throws POSIllegal{if(pos<0||pos>=this.usedsize){throw  new POSIllegal("pos不合法,你的pos是 :"+pos);}}
@Override
public void display()
{// 打印顺序表for(int i=0;i<this.usedsize;i++){System.out.print(myarray[i]);System.out.print(" ");}System.out.println();
}@Overridepublic void add(int data){checkcap();this.myarray[this.usedsize] =data;this.usedsize++;}@Overridepublic void add(int pos, int data){checkcap();try {checkPos(pos);}catch (POSIllegal e){e.printStackTrace();return ;}for(int i=this.usedsize-1;i>=pos;i--){this.myarray[i+1]=this.myarray[i];}this.myarray[pos]=data;this.usedsize++;}@Overridepublic boolean contains(int toFind){if(isEmpty()){System.out.println("找不到,因为顺序表是空的");return false;}for(int i=0;i<usedsize;i++){if(this.myarray[i]==toFind){System.out.println("找到了,它的下标是 :"+i);return true;}}System.out.println("顺序表里没有这么元素");return  false;}@Overridepublic int indexOf(int toFind){if(isEmpty()){return -1;}else{for(int i=0;i<this.usedsize;i++){if(this.myarray[i]==toFind)return i;}}return -1;}@Overridepublic int get(int pos){try {return this.myarray[pos];} catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();System.out.println("越界了,数组只有"+myarray.length+"这么大");System.out.println("请你看看自己是不是选择了负数或者大于数组大小的数");return  pos;}}@Overridepublic void set(int pos, int value){try {checkPosSet(pos);}catch (POSIllegal e){e.printStackTrace();return ;}this.myarray[pos]=value;}@Overridepublic void remove(int toRemove){int idx=indexOf(toRemove);if(idx==-1){System.out.println("没有这个数字哦");}else{for(int i=idx;i<usedsize-1;i++){this.myarray[i]=this.myarray[i+1];}usedsize--;}}@Overridepublic int size(){return this.usedsize;}@Overridepublic void clear(){if(isEmpty()){System.out.println("没法清理,顺序表是空的");return ;}for(int i=0;i<this.usedsize;i++){this.myarray[i]=0;}display();System.out.println("清空完成");}
}
package LIST;public class POSIllegal extends RuntimeException
{public POSIllegal(String message){super(message);}
}

结尾

可以看到,对于核心功能,我写的很草率,压根没有写完整,只是随便写了几个增删查改的功能,如果要细化还是能出很多的,交给能看到这里的读者了.

我写学过用C语言手搓顺序表,只能说,Java还是更简单一点.

需要我的完整代码,可以访问我的GitHub,链接点进去,这部分代码在JavaDS  List当中

需要就点个星呗,我的GitHub有的乱,后续我会整理的.

calljsh/Call-JJ-java (github.com)

到这里我也写了快一个小时了,不知道有没有人可以看到啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

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

相关文章

清华大学提出IFT对齐算法,打破SFT与RLHF局限性

监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是预训练后提升语言模型能力的两大基础流程&#xff0c;其目标是使模型更贴近人类的偏好和需求。 考虑到监督…

Python flask怎么连接MySQL?

在Python中连接MySQL并使用模型创建新的表&#xff0c;通常我们会使用ORM&#xff08;对象关系映射&#xff09;库&#xff0c;比如SQLAlchemy或者Django ORM&#xff0c;它们允许我们定义Python类来映射到数据库中的表&#xff0c;并通过这些类进行数据库操作。下面是一个使用…

【Vue】v-else 和 v-else-if

作用&#xff1a;辅助v-if进行判断渲染 语法&#xff1a; v-else v-else-if"表达式"PS&#xff1a;需要紧接着v-if使用 示例代码&#xff1a; <body><div id"app"><p v-if"gender 1">性别&#xff1a;♂ 男</p><…

Java基础入门day60

day60 购物车案例补充 设置欢迎页 打开也系统&#xff0c;就可以直接看到商品列表页面 之前曾经设置过欢迎页&#xff0c;都是针对页面&#xff0c;可以有html页面&#xff0c;也可以有jsp页面 但是今天我们将一个servlet设置成欢迎页 在web.xml文件中设置欢迎页 <welcome…

【C++】牛客——JZ38 字符串的排列

✨题目链接&#xff1a; JZ38 字符串的排列 ✨题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数…

Pi 母公司将开发情感 AI 商业机器人;Meta 科学家:Sora 不是视频生成唯一方向丨RTE 开发者日报 Vol.214

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

圆通(有原则,会变通) VS 圆滑

圆通不是圆滑&#xff0c;圆通是随机应变&#xff0c;圆滑则是投机取巧&#xff0c;两者差别很大。圆通更趋向于褒义。圆滑的意思是不负责任&#xff0c;擅长推卸&#xff0c;不得罪人&#xff0c;圆通的意思是坚持自己的原则&#xff0c;但是不会使用粗暴的方式来解决&#xf…

动手学操作系统(四、MBR读取硬盘加载Loader)

动手学操作系统&#xff08;四、MBR读取硬盘加载Loader&#xff09; 在上一节中&#xff0c;我们学习了使用MBR来直接控制显卡进行显示&#xff0c;在这一节中我们学习如何让MBR来操作硬盘&#xff0c;加载Loader来完成操作系统的后续启动过程。 文章目录 动手学操作系统&…

神经网络与深度学习——第14章 深度强化学习

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第14章 深度强化学习 深度强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;&#xff0c;也叫增强学习&#xff0c;是指一类从与环境交互中不断学习的问题以及解决这类问题…

JavaScript引用外部js文件

我们可以把脚本保存到外部文件中。外部文件通常包含被多个网页使用的代码。外部 JavaScript 文件的文件扩展名是 .js。如需使用外部文件&#xff0c;请在 <script> 标签的 "src" 属性中设置该 .js 文件&#xff1a; 如&#xff1a; <!DOCTYPE html> &l…

SQL刷题笔记day4补

1题目 我的正确代码 select e.last_name,e.first_name,d.dept_name from employees e left join (select departments.dept_name,dept_emp.emp_no,dept_emp.dept_no from departments join dept_emp on departments.dept_nodept_emp.dept_no) d on e.emp_nod.emp_no复盘&…

(文章复现)分布式电源接入配电网承载力评估方法研究

参考文献&#xff1a; [1]郝文斌,孟志高,张勇,等.新型电力系统下多分布式电源接入配电网承载力评估方法研究[J].电力系统保护与控制,2023,51(14):23-33. 1.摘要 随着光伏和风电等多种分布式电源的接入&#xff0c;使得传统配电网的结构及其运行状态发生了较大改变。因此&…

机器学习-8-超参数寻优的常用算法

参考参数优化系列1–随机搜索算法原理及其代码实现 参考参数优化系列2–网格搜索 参考参数优化系列3–贝叶斯算法 参考参数优化系列4–强化学习算法 参数优化系列5–粒子群算法 参考贝叶斯超参数寻优scikit-optimize 参考全面总结机器学习超参数调优 1 随机搜索算法 随机搜索…

【网络】网络编程套接字

一、知识提及 1.源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址 2.端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;IP地址 …

一文介绍数据和模型漂移(Drift):漂移检测示例

大家好&#xff0c;漂移(Drift)是机器学习中用来描述模型在生产环境中随着时间推移而性能逐步下降的现象&#xff0c;由很多原因引起&#xff0c;主要原因是随着时间推移输入数据&#xff08;x&#xff09;分布的变化和期望目标&#xff08;y&#xff09;之间的关系发生了变化。…

PHP MySQL图解学习指南:开启Web开发新篇章

PHP曾经是最流行的Web开发语言&#xff0c;许多世界领先的网站(如Facebook、维基百科和WordPress)都是用它编写的。PHP运行在Web服务器端&#xff0c;通过使用存储在MySQL数据库中的数据&#xff0c;使得网站可以为每一位访问者显示不同的定制页面。书中采用简单、直观的图示化…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

可选链与空值合并运算符的妙用

可选链&#xff08;Optional Chaining&#xff09;和空值合并运算符&#xff08;Nullish Coalescing Operator&#xff09;是 JavaScript 中的两个新特性&#xff0c;它们可以在处理可能为 null 或 undefined 的值时提供更简洁和安全的代码。 可选链允许我们通过在对象的属性后…

【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA

文章目录 一、内容介绍二、内页插图三、作者简介四、前言/序言五、目录 一、内容介绍 《AI数据处理实战108招&#xff1a;ChatGPTExcelVBA》通过7个专题内容、108个实用技巧&#xff0c;讲解了如何运用ChatGPT结合办公软件Excel和VBA代码实现AI办公智能化、高效化。随书附赠了…