【Java】实现顺序表基本的操作(数据结构)

文章目录

  • 前言
  • 顺序表
  • 1、打印顺序表
  • 2、增加元素
  • 3、在任意位置增加元素
  • 4、判断是否包含某个元素
  • 5、查找某个元素对于的位置
  • 6、获取任意位置的元素
  • 7、将任意位置的元素设为value
  • 8、删除第一次出现的关键字
  • 9、获取顺序表长度
  • 10、清空顺序表
  • 总结


前言

在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储


顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改
在这里插入图片描述
接下来我们要实现一些方法来对数组进行增删查改等操作

创建一个类:

public class MyArrayList {//数组public int[] elem;//数组中的元素个数public int usedSize;//当前数组默认的容量public static final int DEFAULT_CAPACITY = 5;public MyArrayList() {elem = new int[DEFAULT_CAPACITY];}
}    

1、打印顺序表

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

2、增加元素

增加元素默认是在数组的最后位置增加元素
在增加元素之前我们要先判断数组是否满了

判读数组是否满:

public boolean isFull() {return usedSize == elem.length;
}

增加元素:

public void add(int data) {if(isFull()) {//满了进行扩容elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = data;usedSize++;
}

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);myArray.display();}
}

在这里插入图片描述

3、在任意位置增加元素

注意:这里的增加元素要保证位置的合法性不能小于0,也不能大于数组的长度,更不能间隔着插入,即插入的位置前面一定要有元素;同时插入时其余元素要后移;如果不合法就抛一个异常
同样增加元素之前我们要判断数组是否满了

位置是否合法:

private void checkPosOfAdd(int pos) {if(pos < 0||pos > usedSize) {throw new PosException("pos位置不合法:"+pos);}
}  

任意位置增加元素:

public void add(int pos, int data) {//判断位置是否合法checkPosOfAdd(pos);if(isFull()) {elem = Arrays.copyOf(elem,2*elem.length);}for (int i = usedSize - 1; i >= pos; i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);myArray.add(1,15);myArray.display();}
}

在这里插入图片描述

4、判断是否包含某个元素

遍历数组判断是否与这个元素相同:

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

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);System.out.println(myArray.contains(20));System.out.println(myArray.contains(200));}
}

在这里插入图片描述

5、查找某个元素对于的位置

遍历这个数组找与要查找的元素是否相同,相同返回该元素的下标,不同返回-1:

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

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);System.out.println(myArray.indexOf(20));System.out.println(myArray.indexOf(200));}
}

在这里插入图片描述

6、获取任意位置的元素

同样我们要判断该位置是否合法,还有要判断顺序表是否为空,两个条件都合法时返回该位置的元素

顺序表是否为空:

public boolean isEmpty() {return usedSize == 0;
} 

获取任意位置的元素:

public int get(int pos) {//判断该位置是否合法checkPosOfAdd(pos);if(isEmpty()) {throw new EmptyException("顺序表为空");}return elem[pos];
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);System.out.println(myArray.get(1));}
}

在这里插入图片描述

7、将任意位置的元素设为value

与获取任意位置的元素方法相同,要判断该位置是否合法,还要判断顺序表是否为空

将任意位置的元素设为value:

public void set(int pos, int value) {//判断位置是否合法checkPosOfAdd(pos);if(isEmpty()) {throw  new EmptyException("顺序表为空");}this.elem[pos] = value;
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);myArray.set(1,15);myArray.display();}
}

在这里插入图片描述

8、删除第一次出现的关键字

在进行删除操作时要判断顺序表是否为空,找到要删除元素的下标,最后
挪动数据

删除操作:

 public void remove(int toRemove) {if(isEmpty()) {throw new EmptyException("顺序表为空");}int ret = indexOf(toRemove);for (int i = ret; i < usedSize; i++) {elem[i] = elem[i+1];}usedSize--;
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);myArray.remove(10);myArray.display();}
}

在这里插入图片描述

9、获取顺序表长度

public int size() {return usedSize;
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);System.out.println(myArray.size());}
}

在这里插入图片描述

10、清空顺序表

public void clear() {usedSize = 0;
}    

测试:

public class Test {public static void main(String[] args) {MyArrayList myArray = new MyArrayList();myArray.add(10);myArray.add(20);myArray.add(30);myArray.add(40);myArray.display();System.out.println("*******");myArray.clear();myArray.display();}
}

在这里插入图片描述


总结

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
1.ArrayList是以泛型方式实现的,使用时必须要先实例化
2.ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
3.ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
4.ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
5.和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者
CopyOnWriteArrayList
6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

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

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

相关文章

编织魔法世界——计算机科学的奇幻之旅

文章目录 每日一句正能量前言为什么当初选择计算机行业计算机对自己人生道路的影响后记 每日一句正能量 人生就像赛跑&#xff0c;不在乎你是否第一个到达尽头&#xff0c;而在乎你有没有跑完全程。 前言 计算机是一个神奇的领域&#xff0c;它可以让人们创造出炫酷的虚拟世界…

gpt3、gpt2与gpt1区别

参考&#xff1a;深度学习&#xff1a;GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot&#xff08;零次学习&#xff09;简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成&#xff0c;本质上是自回归模型…

【Android】查看keystore的公钥和私钥

前言&#xff1a; 查看前准备好.keystore文件&#xff0c;安装并配置openssl、keytool。文件路径中不要有中文。 一、查看keystore的公钥&#xff1a; 1.从keystore中获取MD5证书 keytool -list -v -keystore gamekeyold.keystore 2.导出公钥文件 keytool -export -alias …

vue+echarts实现桑吉图的效果

前言&#xff1a; 在我们项目使用图形的情况下&#xff0c;桑吉图算是冷门的图形了&#xff0c;但是它可以实现我们对多级数据之间数据流向更好的展示的需求&#xff0c;比如&#xff0c;我们实际数据流向中&#xff0c;具有1对多&#xff0c;多对多的情况下&#xff0c;如果用…

IDEA加载阿里Java规范插件

IDEA加载阿里巴巴Java开发手册插件&#xff0c;在写代码的时候会自动扫描代码规范。 1、打开Settings 2、打开Plugins 3、搜索Alibaba Java Code Guidelines&#xff08;XenoAmess TPM&#xff09;插件&#xff0c;点击Install进行安装&#xff0c;然后重启IDE生效。 4、鼠标右…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了一个全面的电影信息平台…

系统思考与啤酒游戏经营沙盘

结束一家汽车零配件公司《系统思考与啤酒游戏经营沙盘》的内训课&#xff0c;4个小组基本上都有共同的心智模式&#xff0c;这也代表团队有一些集体的盲点。不仅仅对啤酒游戏经营沙盘做了复盘&#xff0c;同时也借用学员画出的系统环路图完成真实案例的研讨以及团队共识&#x…

宏工科技:电池装备高效交付“唯快不破”

面向TWh时代的锂电设备供应需求&#xff0c;锂电设备向标准化、模块化方向升级的趋势显现。 “近年来&#xff0c;宏工科技聚焦电池匀浆技术创新与规模化降本&#xff0c;通过电池匀浆工艺段的模块化探索与应用&#xff0c;从项目周期、成本、效率等多维度赋能电池前段制造高质…

Ubuntur编译ROS报错:error PCL requires C++14 or above

ubuntu20.04 编译ROS包 报错&#xff1a; error&#xff1a; PCL requires C14 or above&#xff1a; 修改Cmakelists.txt文件&#xff1a; set&#xff08;CMAKE_CXX_STANDARD 14&#xff09; 再次编译成功.

图纸加密防泄密软件排名

图纸作为企业的重要资产&#xff0c;如何保护其安全&#xff0c;防止泄密&#xff0c;成为了企业亟待解决的问题。而图纸加密防泄密软件&#xff0c;正是解决这一问题的有效工具。 一、图纸加密防泄密软件的重要性 图纸加密防泄密软件通过对图纸进行加密处理&#xff0c;使得只…

重估拼多多,TEMU带给拼多多的不止是市值增量

监制 | 何玺 排版 | 叶媛 谁也没有想到&#xff0c;中国电商的格局改变居然如此之快。 12月29日&#xff0c;拼多多市值超越多年雄踞国内电商头把交椅的阿里巴巴&#xff0c;成为美股市值最大中概股。从此时开始&#xff0c;中国电商开始“拼”时代。 拼多多凭什么能超越阿里…

MySQL 包含查询特殊符号数据

当你模糊查询包含特殊符号的数据时&#xff0c;如果不加上特殊处理&#xff0c;查询结果是错误的。 如果你查的数据包含如上字符或者其他特殊字符&#xff0c;需要加上\转义字符。 如下示例&#xff1a; SELECT * FROM t_bc_user t where t.name LIKE %\_%

qt 5.15.2 主窗体菜单工具栏树控件功能

qt 5.15.2 主窗体菜单工具栏树控件功能 显示主窗体效果&#xff1a; mainwindow.h文件内容&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QString> #include <QMessageBox>#inc…

基于GUI+Swing+MySQL开发的聊天室设计

基于GUISwingMySQL开发的聊天室设计 项目介绍&#x1f481;&#x1f3fb; 本项目是基于Java Swing的聊天室设计&#xff0c;旨在为用户提供一个便捷、高效的在线交流平台。在这个项目中&#xff0c;我们实现了以下几个主要功能&#xff1a; 1. 服务器启动成功&#xff1a;当用户…

Java实现动态加载的逻辑

日常工作中我们经常遇到这样的场景&#xff0c;某某些逻辑特别不稳定&#xff0c;随时根据线上实际情况做调整&#xff0c;比如商品里的评分逻辑&#xff0c;比如规则引擎里的规则。 常见的可选方案有: JDK自带的ScriptEngine 使用groovy&#xff0c;如GroovyClassLoader、Gro…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

react native 环境准备

一、必备安装 1、安装node 注意 Node 的版本应大于等于 16&#xff0c;安装完 Node 后建议设置 npm 镜像&#xff08;淘宝源&#xff09;以加速后面的过程&#xff08;或使用科学上网工具&#xff09;。 node下载地址&#xff1a;Download | Node.js设置淘宝源 npm config s…

【T+】畅捷通T+软件安装过程中停留在:正在配置产品位置或进度80%位置。

【问题描述】 畅捷通T软件在安装过程中&#xff0c; 进度条一直停留在【正在配置产品…】位置。 【解决方法】 打开【任务管理器】&#xff0c;想必这个如何打开&#xff0c;大家应该都会。 在【进程】中找到【DBConfig.exe】或者【Ufida.T.Tool.SM.DBConfig.exe】进程并结束…

【keil备忘录】2. stm32 keil仿真时的时间测量功能

配置仿真器Trace内核时钟为单片机实际的内核时钟&#xff0c;需要勾选Enable设置&#xff0c;设置完成后Enable取消勾选也可以&#xff0c;经测试时钟频率配置仍然生效&#xff0c;此处设置为48MHZ: 时间测量时必须打开register窗口&#xff0c;否则可能不会计数 右下角有计…