数据结构第二篇【关于java线性表(顺序表)的基本操作】

【关于java线性表(顺序表)的基本操作】

      • 线性表是什么?🐵🐒🦍
      • 顺序表的定义🦧🐶🐵
      • 创建顺序表
      • 新增元素,默认在数组最后新增
      • 在 pos 位置新增元素
      • 判定是否包含某个元素
      • 查找某个元素对应的位置
      • 获取 pos 位置的元素
      • 给 pos 位置的元素设为 value 更新
      • 删除第一次出现的关键字key
      • 获取顺序表长度
      • 清空顺序表
      • 打印顺序表

本文主要讲解关于顺序表的基本操作,希望大家能够自己动手敲一敲🐒🦍🦧🐶

在这里插入图片描述

线性表是什么?🐵🐒🦍

线性表是一种数据结构,是由零个或多个数据元素的有限序列组成的。每个元素除了第一个元素外,都有一个直接前驱元素,除了最后一个元素外,都有一个直接后继元素。线性表的数据集合为{a1,a2,…,an},每个元素的类型均为DataType。线性表是存储逻辑关系为"一对一"的数据的最简单一种存储结构。线性表的物理结构不一定是连续的。

顺序表的定义🦧🐶🐵

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
顺序表:可动态增长的数组,要求数据是连续存储的,动态顺序表就是使用动态开辟的数组存储,我会通过代码来给大家讲解

以下顺序表中的方法是需要掌握的

public interface IList2 {//新增元素,默认在数组最后新增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 位置的元素设为 value  更新public void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove) ;// 获取顺序表长度public int size();// 清空顺序表public void clear() ;// 打印顺序表public void display();boolean isFull();//数组是否满了public boolean isEmpty();//数组是否为空
}

创建顺序表

public class MyArrayList {public int[] elem;public int usedSize;                    public static final int DEFAULT_SIZE=10;public MyArrayList(){this.elem = new int[DEFAULT_SIZE];  }public MyArrayList(int capacity){this.elem = new int[capacity];     }

首先我们创建一个顺序表(看做一个数组),有两个属性,第一个elem为数组,第二个为usedSize表示有效数据的个数。数组的长度我们通过构造方法来初始化,第一种是创建一个数组长度为10(用常量DEFAULT_SIZE表示)的数组,第二种是通过传参数来自定义数组的长度。

新增元素,默认在数组最后新增

在敲代码以前,我们需要考虑一个情况,如果数组满了,怎么才能添加元素,所以我们在添加元素之前,检查一下数组是否满了,如果满了,我们将进行扩容,再添加元素。而检查数组我们定义一个方法以后用到直接调用即可。我们需要用到两个方法一个为检查是否满了,一个方法来扩容。

 public void add(int data) {checkCapacity();  //检查容量this.elem[this.usedSize] = data;this.usedSize++;}private void checkCapacity(){  if(isFull()){//扩容elem = Arrays.copyOf(elem,elem.length*2);//将elem数组的长度扩容为原来的两倍}}public boolean isFull() {return usedSize==elem.length; //数组长度是否等于有效数据的长度}

在 pos 位置新增元素

我们首先需要思考,pos位置是否合法,pos如果为-1,或者超多数组长度,则不再新增,那么我们使用自定义异常来处理,如果pos合法,在检查数组的容量,最后在新增元素,新增元素时,我们将从最后一个有效元素向后移动,依次向前,直到i<pos,pos位置为空,将elem[pos] 位置插入数据

public void add(int pos, int data) {try {checkPosOnAdd(pos);}catch (PosILLegality e){e.getStackTrace();return;}checkCapacity();for(int i = usedSize-1;i>=pos;i--){elem[i+1]=elem[i];}elem[pos] = data;usedSize++;}private void checkPosOnAdd(int pos)throws PosILLegality{if(pos<0&&pos>usedSize){System.out.println("不符合法");throw new PosILLegality("插入元素下标异常"+pos);}}public class PosILLegality extends RuntimeException{public PosILLegality(String msg){super(msg);}
}

判定是否包含某个元素

首先需要考虑如果数组为空,没有元素则不查找,直接返回false,其次,遍历数组查看是否存在

public boolean contains(int toFind) {if(isEmpty()){return false;}for(int i = 0;i<usedSize;i++){if(elem[i]==toFind){return true;}}return false;}public boolean isEmpty() {return false;
}

查找某个元素对应的位置

首先判断数组是否为空,然后在进行查找,找到返回下标

public int indexOf(int toFind) {if(isEmpty()){return -1;}for(int i = 0;i<usedSize;i++){if(elem[i]==toFind){return i;}}return -1;}

获取 pos 位置的元素

首先,判断pos位置是否合法,与新增元素不同(新增元素可以在数组最后新增)查找元素(只能在有效数据中查找),范围有差异,如果pos不合法直接抛出自定义异常,其次判断数组是否为空,最后在返回pos位置的元素。

 public int get(int pos) throws MyArrayListEmpty{checkPosOnGetAndSet(pos);if(isEmpty()){throw new MyArrayListEmpty("获取指定下标元素时"+"顺序表位空");}return elem[pos];}private void checkPosOnGetAndSet(int pos) throws PosILLegality {if (pos < 0 || pos >= usedSize) {System.out.println("不符合法");throw new PosILLegality("获取制定下标的元素异常" + pos);}}public class PosILLegality extends RuntimeException{public PosILLegality(String msg){super(msg);}
}
public class MyArrayListEmpty extends RuntimeException{public MyArrayListEmpty(String msg){super(msg);}
}

给 pos 位置的元素设为 value 更新

首先,判断pos位置是否合法,与新增元素不同(新增元素可以在数组最后新增)查找元素(只能在有效数据中查找),范围有差异,如果pos不合法直接抛出自定义异常,如果合法,在进行修改元素

public void set(int pos, int value) {checkPosOnGetAndSet(pos);elem[pos]=value;}
private void checkPosOnGetAndSet(int pos) throws PosILLegality {if (pos < 0 || pos >= usedSize) {System.out.println("不符合法");throw new PosILLegality("获取制定下标的元素异常" + pos);}}public class PosILLegality extends RuntimeException{public PosILLegality(String msg){super(msg);}
}

删除第一次出现的关键字key

首先用java自带函数找到关键字的下标,如果存在,那么如何删除呢,我们通过要删除的元素的后一个往前盖,元素i范围小于usedSize-1,如果等于usedSize-1,elem[i-1]将会越界

 public void remove(int toRemove) {int index = indexOf(toRemove);if(index==-1){System.out.println("没有这个数字");return;}for(int i =index;i<usedSize-1;i++){elem[i]=elem[i+1];}usedSize--;}

获取顺序表长度

public int size() {return this.usedSize;}

清空顺序表

public void clear() {this.usedSize=0;}

打印顺序表

public void display() {for(int i = 0;i<this.usedSize;i++){System.out.println(this.elem[i]+" ");}System.out.println();}

在这里插入图片描述

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

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

相关文章

使用高性能NIO框架netty实现IM集群对聊方案

文章目录 前言技术积累什么是nettynetty如何实现IM如何实现IM集群 实战演示基础配置netty搭建IM集群redis发布订阅 实战测试 前言 在前面的博文中我们分享了原生websoket集群搭建&#xff0c;也用redis 发布订阅实现了集群消息正常有序分发。但是有不少同学希望风向一期netty实…

Json差异比较

json差异比较 如何比较两个json的差异 代码实现 导入依赖 <dependency><groupId>cn.xiaoandcai</groupId><artifactId>json-diff</artifactId><!-- 旧版本可能存在某些缺陷。版本请以maven仓库最版为准。 --><version>4.1.3-RC1-R…

问题记录_stm32“No target connected“

问题描述&#xff1a; 基于HAL库和stm32cubeMX生成的代码&#xff0c;烧录时出现如下报错窗口&#xff1a; 问题原因&#xff1a; stm32cubeMX生成代码时关闭了SWJ调试功能 解决方法&#xff1a; 在项目中找到__HAL_AFIO_REMAP_SWJ_DISABLE();并注释掉 然后短按复位键的…

AI大模型是如何测试效果的?

AI大模型的测试和评估是一个复杂的过程&#xff0c;通常包括多个方面的考量&#xff0c;因此对大模型的测试也称为多度测试。 可以简单概括为以下几个方面&#xff1a; 基准测试&#xff08;Benchmarking&#xff09;&#xff1a;使用标准数据集和任务评估模型性能&#xff0c…

c语言从入门到函数速成(完结篇)

哈喽&#xff0c;小伙伴们大家好呀&#xff0c;本篇文章是这个系列的完结篇&#xff0c;希望大家看完后能有所收获哦 首先能看到这里的同学&#xff0c;一定也是自觉性比较强的了&#xff0c;我会在文章末尾给大家发点小福利 那么&#xff0c;我们先来通过数学中的函数来引入一…

基于python的k-means聚类分析算法,对文本、数据等进行聚类,有轮廓系数和手肘法检验

K-means算法是一种常见的聚类算法&#xff0c;用于将数据点分成不同的组&#xff08;簇&#xff09;&#xff0c;使同一组内的数据点彼此相似&#xff0c;不同组之间的数据点相对较远。以下是K-means算法的基本工作原理和步骤&#xff1a; 工作原理&#xff1a; 初始化&#x…

Elasticsearch之入门与安装

Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

探索python循环逻辑的魅力:从无限到有限

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;循环逻辑的初步认识 二、无限循环&#xff1a;持续运转的引擎 三、有…

通过 PW6606 快充电压诱骗芯片,了解 USB-A 与 USB-C 快充协议

充电器一般分两种&#xff1a; 1&#xff0c; A 口充电器&#xff0c;就是我们常见的 USB 口&#xff0c;如下图&#xff0c;这种通用快充协议叫&#xff1a; QC3.0,QC2.0 快充&#xff0c;是属于快充刚开始的充电协议&#xff0c;支持 5V,9V,12V 和 20V 电压输出充电器&#x…

国内信创数据库生态

国内信创数据库生态 国内信创数据库主要包括但不限于以下几种&#xff1a; 数据库类型与厂商&#xff1a; 达梦 &#xff08;武汉达梦&#xff09; 官网 https://www.dameng.com/DM8.html 人大金仓 &#xff08;北京&#xff09; 官网 https://www.kingbase.com.cn/tyxsjk/i…

Open3D(C++) OTSU点云二值化

目录 一、算法原理二、代码实现三、结果展示1、原始点云2、二值化本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 最大类间方差法(Between-class scatter method)是一种用于分割的方法,它通过计算图…

Moto和Inter字节序

inter: 低地址按照start_bit位放低字节依次往高字节填充 MotoLsb: 低地址按照start_bit位放高字节&#xff0c;依次往低字节填充MotoMsb&#xff1a;高字节按照start_bit位放低地址&#xff0c;依次往高字节填充

【linux】服务器sshd服务导致CPU负载过高问题

一、背景 一台服务器突然访问ssh特别缓慢&#xff0c;top命令查看后&#xff0c;服务器Load Average占用很高。看相关异常进程都是sshd服务导致。 二、排查思路 查看服务器内存&#xff0c;磁盘io都是正常&#xff0c;在用连接数也不多。 一开始就怀疑是不是服务器被恶意攻…

grpc、多集群、多租户

gRPC和服务发现 一个A high-performance, open-source universal RPC framework&#xff0c;高性能、开源的通用 RPC 框架。使用protobuf 语言基于文件定义服务&#xff0c;通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub。移动端上面则是基于标准的 HTTP…

snmp学习小结

背景 很多厂商网络设备获取网络信息接口不一样&#xff0c;snmp用来统一接口 官网Net-SNMP 模型 每个主机可以安装自己的snmp agent&#xff0c;它可以监控目标机器的网络流量&#xff0c;当外部查询snmp信息时&#xff0c;请求会发到目标机器的snmp agent&#xff0c;由sn…

谷歌地图 | Google I/O ‘24 重磅发布助力企业拓展海外市场的新功能!

编者按&#xff1a;本文是 Google I/O 2024 系列的一部分&#xff0c;该系列分享了Google 年度开发者大会上最新的 Google Maps Platform 新闻。 距全球首个 Google Maps API 问世已近 20 年。它引领了网络和移动端地理空间体验的革命。从那时起&#xff0c;Google Maps Platf…

深入剖析—【服务器硬件】与【Nginx配置】:从基础到实战

服务器硬件部分&#xff1a; Processor (CPU)&#xff1a;服务器的计算核心&#xff0c;负责处理数据和执行程序。Memory (RAM)&#xff1a;用于暂时存储和快速访问数据&#xff0c;决定了系统的运行速度和并发处理能力。Storage (HDD/SSD)&#xff1a;长期存储数据的设备&…

力扣hot100:146. LRU 缓存

力扣hot100&#xff1a;146. LRU 缓存 听说华为实习笔试考了这题 如何使得插入操作时 O ( 1 ) O(1) O(1)呢&#xff1f;我们需要维护一个时间的长短&#xff0c;以便于取出离现在最长的时间&#xff0c;这个时间比较容易实现&#xff0c;我们维护一个time表示当前时间&#x…

kettle学习之子映射组件

映射组件就跟java中的函数方法一样&#xff0c;类似一个子流程。 练习开始 根据数据库表中的id查询出想要的字段&#xff0c;并把字段存到excel表中 一、表输入 二、子映射 映射输入规范&#xff0c;类似java方法中的形参 name vsxcd是方法返回的参数 三、excel输出 运行结果…

VS2022编译CMake的工程

开源项目大都是用Make文件组织项目代码编译。对熟悉Window体系&#xff0c;一直用VS套件工作的人&#xff0c;还是有不小的隔阂。 好在有大神们帮助我们解决此类问题&#xff0c;使用CMake工具&#xff0c;可以自动转换工程类型。 1、解压缩代码&#xff0c;找到CMakeList.tx…