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

news/2024/7/14 18:28:07/文章来源:https://blog.csdn.net/cjejwe/article/details/139298074

前言

笔者开始学习数据结构了,虽然笔者已经会用了,不管是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.luyixian.cn/news_show_1054569.aspx

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

相关文章

HarmonyOS-9(stage模式)

配置文件 {"module": {"requestPermissions": [ //权限{"name": "ohos.permission.EXECUTE_INSIGHT_INTENT"}],"name": "entry", //模块的名称"type": "entry", //模块类型 :ability类型和…

Sourcetree安装教程及使用

1 Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端&#xff0c;它由Atlassian开发&#xff0c;提供了跨平台的支持&#xff0c;可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码&#xff0c;不需要在命令行中输入复杂的Git命令&#x…

什么是数字化采购?一文解析!

在快速发展的数字经济时代&#xff0c;越来越多的企业开始想要了解什么是数字化采购&#xff1f;因为数字化采购已经成为提升效率、降低成本的关键举措。简单来说&#xff0c;采购数字化就是利用先进的数字化技术和工具&#xff0c;对传统的采购流程进行改造和优化&#xff0c;…

el-image本地图片不显示,提示加载失败

问题描述&#xff1a;el-image使用本地图片不显示&#xff0c;提示加载失败。 <el-image src"../../assets/img/value.png"></el-image> 解决方法&#xff1a;src用里面加个require&#xff0c;注意给 src 属性加: <el-image :src"require(../..…

sysbench压测mysql性能测试命令和报告

sysbench压测mysql性能测试命令和报告 一、安装sysbench工具二、创建测试数据库三、基于sysbench构造测试表和测试数据四、数据库性能测试1、数据库读写性能测试2、数据库读性能测试3、数据库删除性能测试4、数据库更新索引字段性能测5、数据库更新非索引字段性能测试6、数据库…

使用PySpark构建和评估逻辑回归模型预测质量是否合格

使用PySpark构建和评估逻辑回归模型预测质量是否合格 随着数据量的不断增长&#xff0c;传统的数据处理工具已经难以满足需求。PySpark作为大数据处理框架Apache Spark的Python API&#xff0c;为大规模数据处理和机器学习提供了强有力的支持。本文将详细介绍如何使用PySpark进…

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)

1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…

Token验证流程、代码示例、优缺点和安全策略,一文告诉你。

Token和Session都是用于身份验证和授权的机制&#xff0c;而且Token渐渐成为主流&#xff0c;有不少小伙伴对token的认识不全&#xff0c;这里给大家分享下。 一、什么是Token Token是一种用于身份验证和授权的令牌&#xff0c;通常用于在客户端和服务器之间进行安全的通信。…

[C][符号]详细讲解

目录 1.算术操作符2.接续符和转义符 \1.续行符使用2.转义 3.单引号和双引号4.逻辑运算符5.位运算符6.移位操作符7. --操作8.条件操作符9.逗号表达式10.操作符的属性 1.算术操作符 算术操作符&#xff1a; - * / %除了%操作符以外&#xff0c;其他的几个操作符可以作用于整数和…

从这些原理中,读懂迅软DSE加密系统

加密技术是保护信息安全的系统&#xff0c;通过对原始数据进行加密&#xff0c;使得未经授权的人无法读取这些信息。 一、迅软DSE加密系统干什么用的&#xff1f; ★保护隐私&#xff1a;加密确保个人、机构的敏感信息在传输和存储过程中不被未授权的人访问。 ★防止数据泄露…

json/excel文件上传下载工具方法汇总

文章目录 浏览器下载json文件浏览器下载excel文件【Workbook】浏览器导入json文件【ObjectMapper】浏览器导入excel文件【Workbook】ResourceLoader读取类路径下单个jsonResourceLoader读取类路径下所有json文件 浏览器下载json文件 Operation(summary "设备模型导出(带分…

计算机图形学入门03:二维基本变换

变换(Transformation)可分为模型(Model)变换和视图(Viewing)变换。在3D虚拟场景中相机的移动和旋转&#xff0c;角色人物动画都需要变换&#xff0c;用来描述物体运动。将三维世界投影变换到2D屏幕上成像出来&#xff0c;也需要变换。 1.缩放变换 缩放(Scale)变换&#xff1a; …

Echarts圆环图偏移后 中心文字居中对齐实现

像上图中这样圆环图并不在div的中间时&#xff0c;中心的文本需要居中展示 一开始用left百分比但数据一旦变长或变短就会偏移 像这样 实在是太不美观了 所以我们这里使用动态的left通过文本的长度来计算 /*** 计算文本宽度* param {String|Number} text* param {String} font*…

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

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

代码随想录算法训练营第36期DAY43

DAY43 343整数拆分 注意&#xff1a;当几个数的数值相近&#xff0c;乘积才会尽可能地大&#xff08;好想&#xff1a;数一大一小&#xff0c;最大当然是自己乘以自己&#xff09; 代码随想录官方题解&#xff1a; class Solution {public: int integerBreak(int n) { …

【Vue】input框自动聚焦且输入验证码后跳至下一位

场景&#xff1a;PC端 样式&#xff1a; <div class"verification-code-input"><input v-model"code[index]" v-for"(_, index) in 5" :key"index" type"text" maxlength"1" input"handleInput(i…

Centos7时区设置及手动修改时间

一、修改系统时区 1、查看时区命令 timedatectl 2、设置时区命令 #下面将时区设置为上海时区 timedatectl set-timezone Asia/Shanghai 3、查看时区看一下新时区有没有生效 timedatectl 二、手动修改系统时间 修改系统时间 date -s "2023-12-25 16:05:10" 查…

【易错题】数据可视化基础练习题(30道选择题)#CDA Level 1

本文整理了数据可视化基础知识相关的练习题&#xff0c;共30道&#xff0c;适用于想巩固数据可视化知识的同学&#xff0c;也可作为备考CDA一级的补充习题。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-可视化&#xff09;。 1&#xff09; 2&#xff09; 3&…

【AI大模型】如何让大模型变得更聪明?基于时代背景的思考

【AI大模型】如何让大模型变得更聪明 前言 在以前&#xff0c;AI和大模型实际上界限较为清晰。但是随着人工智能技术的不断发展&#xff0c;基于大规模预训练模型的应用在基于AI人工智能的技术支持和帮助上&#xff0c;多个领域展现出了前所未有的能力。无论是自然语言处理、…

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …