数据结构第二篇【关于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,一经查实,立即删除!

相关文章

.net aot inherit object.Dispose()”: 没有找到适合的方法来重写解决方法

.net aot inherit object.Dispose()”: 没有找到适合的方法来重写解决方法<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>

【Python爬虫】案例_百度贴吧

声明&#xff1a;案例只用于学习&#xff0c;不得恶意使用 要求&#xff1a;获取帖子的标题和链接 import requests from lxml import etreeclass Tieba(object):def __init__(self,name):self.url https://tieba.baidu.com/f?ieutf-8&kw{}.format(name)self.headers …

人形机器人建模与控制(三) - 机器人控制

L3 Robot Control Robot Control L3 Robot Control1. RepeatForward KinematicsDifferential KinematicsExternal Wrench (Force & Torque) MappingDynamicsGoal for Today2. Feedback Cancellation3. Joint Space ControlSimpler Control Laws

JDBC批量处理(addBatch/executeBatch/clearBatch)

1-操作多条的时候用批量处理&#xff0c;比单条处理效率更高 2-JDBC常用批量处理方法 &#xff08;1&#xff09;addBatch(string)&#xff1a;添加批量处理的sql语句或参数 &#xff08;2&#xff09;executeBatch&#xff1a;执行批量处理语句 &#xff08;3&#xff09;clea…

Java中IO的四大抽象类

InputStream/OutputStream和Reader/Writer类是所有IO流类的抽象父类&#xff0c;需要先简单了解一下这四个抽象类的作用。然后&#xff0c;通过它们具体的子类熟悉相关的用法。 InputStream 此抽象类是表示字节输入流的所有类的父类。InputStream是一个抽象类&#xff0c;它不…

BUG(18) : Caused by: java.lang.ClassNotFoundException

场景 导入了多个mave依赖, 启动是报java.lang.ClassNotFoundException, 报错位置为依赖包里面的子依赖 解决 什么依赖报错, pom文件直接引入该子依赖

代码随想录算法训练营第二十天 | 654.最大二叉树 、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树 题目链接&#xff1a;https://leetcode.cn/problems/maximum-binary-tree/ 文档讲解&#xff1a;https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1MG411G7ox 思路…

使用高性能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…

GDB远程调试

gdb参数选项详解 gdb主要调试的是C/C的程序。要调试C/C的程序&#xff0c;首先在编译时&#xff0c;必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g)的 -g 参数即可。 gcc -g main.c -o main 要用gdb调试程序&#xff0c;必须在编译时加上-g和-ggdb选项&#xff0c…

微服务和资源管理有什么区别?

微服务和资源管理在多个方面存在显著的区别。 微服务是一种软件架构风格&#xff0c;专注于构建小型、独立的服务单元&#xff0c;每个服务单元都运行在自己的进程中&#xff0c;并通过轻量级通信机制进行通信。这些服务单元通常是围绕单一业务功能或职责构建的&#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作为其核心来…

车联网V2X通信技术简介

车联网V2X通信技术是一种将车辆与一切事物相连接的新一代信息通信技术。以下是对车联网V2X通信技术的详细解析&#xff1a; 一、V2X的定义与交互模式 定义&#xff1a;V2X&#xff08;Vehicle to Everything&#xff09;是指车用无线通信技术&#xff0c;其中V代表车辆&#…

探索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…

【文末附gpt升级方案】GPT-4级别的AI系统安全性探讨与未来展望

GPT-4级别的AI系统安全性探讨与未来展望 一、引言 随着人工智能技术的飞速发展&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的突破&#xff0c;大型语言模型如GPT-4已经成为人们关注的焦点。然而&#xff0c;技术的进步往往伴随着争议和质疑。近日&#x…