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;其目标是使模型更贴近人类的偏好和需求。 考虑到监督…

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作为一种新兴的技术手…

动手学操作系统(四、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;是指一类从与环境交互中不断学习的问题以及解决这类问题…

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;使得传统配电网的结构及其运行状态发生了较大改变。因此&…

【网络】网络编程套接字

一、知识提及 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…

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

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

NDIS驱动开发-NET_BUFFER体系

网络数据由通过网络发送或接收的数据包组成。 NDIS 提供数据结构来描述和组织此类数据。 NDIS 6.0 及更高版本的主要网络数据结构包括&#xff1a; NET_BUFFERNET_BUFFER LISTNET_BUFFER_LIST_CONTEXT 它们之间的关系如下: 在 NDIS 6.0 及更高版本中&#xff0c; NET_BUFFER …

串口调试助手中文乱码 解决方案

输出乱码 一般&#xff0c;当串口调试助手输出乱码时&#xff0c;可能有以下几个原因&#xff1a; 波特率设置错误&#xff1a;串口通信需要保证发送和接收的设备使用相同的波特率。请检查串口调试助手和目标设备的波特率设置是否一致。 数据位、停止位或校验位设置错误&…

【目标解算】相机内外参数详细解读+坐标系转换

一、相机参数介绍 1.1 相机内参矩阵 概念&#xff1a;内参矩阵用于描述相机的内部参数&#xff0c;它包含了相机的焦距、主点坐标和图像的畸变等信息。内参矩阵的形式通常为一个3x3的矩阵&#xff0c;常用表示为K。内参矩阵可以将相机坐标系中的三维点映射到图像平面上的二维…

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

GPT-4你了解多少呢

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术一直备受关注。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;NLP领域也取得了显著进步。GPT-4&#xff0c;作为OpenAI公司最新发布的自然语言处理模型…

京东二面:为什么Netty要造FastThreadLocal?

FastThreadLocal 从字面意义上来看&#xff0c;它是“Fast”“ThreadLocal”的结合体&#xff0c;寓意为快速的 ThreadLocal。那么&#xff0c;问题来了&#xff0c;Netty 为什么要再造一个 FastThreadLocal&#xff1f;FastThreadLocal 运行快的原因是啥&#xff1f;除了快之外…