顺序表(快速上手数据结构)

在介绍ArrayList之前, 我们需要先了解List.

List是一个接口,它继承于Collection接口(Collection又继承于最顶层的接口Iterable).  从数据结构的角度来看,List就是一个线性表(Linear List),即n个具有相同类型元素的有限序列, 在该序列上可以执行增删查改等操作.

注意: List是一个接口,不能直接用来实例化. 在集合框架中, ArrayList类和LinkedList类都实现了List接口. 我们可以通过这两个类来实例化对象. 本篇博客主要讲述ArrayList类(顺序表).

目录

顺序表

1. 新增元素

2. 在pos位置新增元素

3. 判定是否包含某个元素

4. 查找某个元素对应的位置,并返回下标 

5. 获取pos位置的元素

6. 给pos位置的元素设为value(给某位置的元素更新)

7. 删除某数字key

8. 获取顺序表的长度

9.清空顺序表


顺序表

顺序表中主要有如下几种方法:

public interface IList {void add(int data); //新增元素(默认在数组最后新增)void add(int pos, int data); //在pos位置新增元素boolean contains(int toFind); //判定是否包含某个元素int indexOf(int ToFind); //查找某个元素对应的位置,并返回下标int get(int pos); //获取pos位置的元素void set(int pos, int value); //给pos位置的元素设为value(更新)void remove(int toRemove); //删除第一次出现的关键字keyvoid size(); //获取顺序表的长度void clear(); //清空顺序表void display(); //打印数组(不属于顺序表中的方法)
}

今天,我们就用Java来实现一遍这七种方法. 相信在我们自己实现完一遍顺序表之后,我们的代码能力和思维会有不小的提升!

首先,我们需要定义一个操作数组,用来让方法对其进行操作:

public class MyArrayList {public int[] elem; //定义一个整型类型的操作数组public int usedSize; //定义一个变量表示已使用空间 (没有初始化--默认是0)public MyArrayList() { //构造方法 (将数组长度初始化为10)this.elem = new int[10];}
}

 

1. 新增元素

void add(int data) 默认在数组的最后新增.

在这里,我们只需要在数组有数据的位置的后一个(即:usedSize位置上(例如: usedSize=5, 那么0,1,2,3,4 位置上有元素, 将新增数据放到5位置上就行))放上我们要新增的数据即可.但是:如果数组满了,还能新增吗? -- 不能,此时需要将数组扩容才能继续新增操作.

结合上面两方面的考虑,我们写出如下代码:

 public void add(int data) {if (isFull()) {elem = Arrays.copyOf(elem,2*elem.length);}this.elem[usedSize] = data;this.usedSize ++;}boolean isFull() {return (usedSize == elem.length);}

我们在main方法里调用它测试一下:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.display();}
}

 运行结果:

2. 在pos位置新增元素

在pos位置新增元素,我们需要考虑的点有以下几个: (1) 将pos位置后的元素整体向后移. (2) 插入新的数据. (3) 检查pos位置是否合法.

  • 检查pos位置是否合法: pos<0时不合法; pos>usedSize时不合法(pos=usedSize时是合法的,因为此时相当于在数组的最后新增一个元素)
  • 移动元素: 令i等于数组最后一个位置(usedSize-1), 从数组最后一个位置开始遍历数组,将 i位置上的元素赋到 i+1位置上
  • 插入数据: 将数据data放到数组下标为pos的位置上即可. 所有操作完成后, 再让usedSize++即可.

注意: pos位置不合法我们可以写一个异常出来,方便检查和处理.

根据上述步骤,我们可以写出如下代码:

    public void add(int pos, int data) {try{checkOfPosAdd(pos); //检查pos是否合法}catch(PosIllegalException e){e.printStackTrace(); //打印异常}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 ++;}private void checkOfPosAdd(int pos) throws PosIllegalException {if (pos < 0 || pos > usedSize) {throw new PosIllegalException("pos位置不合法");}}

在main方法中调用:

    public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();iList.add(2,88);iList.display();}
}

运行结果: 

 

3. 判定是否包含某个元素

对于这个方法的实现, 我们只需遍历数组, 看是否有要找的数据,如果有,则返回true

代码:

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

在main方法中调用:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();System.out.println(iList.contains(2));}
}

运行结果: 

 

4. 查找某个元素对应的位置,并返回下标 

对于这个方法的实现, 我们还是遍历数组.  如果有要找的数据,则返其对应的下标; 如果没有, 则返回-1.

代码:

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

在main方法中调用:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();System.out.println(iList.indexOf(2));}
}

运行结果:

5. 获取pos位置的元素

 实现这个方法,分两步: (1) 判断pos位置是否合法. (2) 返回pos位置元素的值.

(1) pos<0 或 pos>=usedSize 时不合法(pos==UsedSize时此位置上没有元素, 所以不合法). 所以这里我们就需要写一个方法来判断pos是否合法.

(2) 返回pos位置的元素: 直接返回即可.

代码:

public int get(int pos) {try{checkPosOfGetAndSet(pos);}catch(PosIllegalException e) {e.printStackTrace();}return elem[pos];

在main方法中调用:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();System.out.println(iList.get(2));}
}

 运行结果:

6. 给pos位置的元素设为value(给某位置的元素更新)

实现这个方法, 也要分为两步: (1) 判断pos位置是否合法.  (2) 给pos位置的元素设为value

代码:

    public void set(int pos, int value) {try{checkPosOfGetAndSet(pos);}catch(PosIllegalException e){e.printStackTrace();}elem[pos] = value;}

在main方法中调用:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();iList.set(2,333);iList.display();}
}

 运行结果:

7. 删除某数字key

我们首先要判断这个数字书是否在数组里面.然后在删除(删除的方法是"覆盖"--用后面的数据覆盖前面的数据从而实现对前面数据的删除)

代码:

    public void remove(int toRemove) {int pos = indexOf(toRemove);if (pos == -1) {System.out.println("没有要删除的数字");return; //为什么要写return? 有必要吗?}for (int i = pos; i < usedSize-1; i++) {elem[i] = elem[i+1];}this.usedSize--;

在main方法中调用:

public class Test {public static void main(String[] args) {IList iList = new MyArrayList();//实例化一个MyArraList的对象.iList.add(1);iList.add(2);iList.add(3);iList.display();iList.remove(2);iList.display();}
}

 运行结果:

8. 获取顺序表的长度

 代码:

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

9.清空顺序表

本例中:数组是基本类型(int)的, 所以我们只需要把usedSize置为0即可. 但是如果数组中存放的时引用类型,那么即使将usedSize置为0,堆上存放的对象还是被栈上的变量引用着(但是这些对象没用了),这样的话就会造成内存泄漏,形成不必要的内存损失.

所以: 数组中如果存放的是引用类型, 需要先将数组元素置为null, 再将usedSize置为0.

    public void clear() {usedSize = 0;}

 以上就是本篇博客的全部内容啦,如果喜欢小编的文章,可以点赞,评论,收藏~

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

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

相关文章

自动化测试之httprunner框架hook函数实操

本篇介绍httprunner中hook函数的使用&#xff0c;以及通过编程能力实现建设自动化测试更全面的场景覆盖 前置&#xff1a; 互联网时代让我们更快的学习到什么是Httprunner 正文&#xff1a; 经过上文了解到这个框架怎么使用之后&#xff0c;我们开始来探讨一下我们为什么要用…

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.04.10-2024.04.15

文章目录~ 1.Unveiling Imitation Learning: Exploring the Impact of Data Falsity to Large Language Model2.Are Large Language Models Reliable Argument Quality Annotators?3.LoRAP: Transformer Sub-Layers Deserve Differentiated Structured Compression for Large …

Excel文件转Asc文件

单个转换 import os import pandas as pdfilename (10)result01-1.xlsx df pd.read_excel(filename) # 读取Excel文件# 将数据保存为ASC格式 asc_filename os.path.splitext(filename)[0] .asc # 获取文件名并替换扩展名 with open(asc_filename, w) as file:# 写入文件…

【教程】一个比较良心的C++代码混淆器

这是一个比较良心的C代码混淆器&#xff0c;用于信息竞赛训练和保护代码免受抄袭。本文将介绍这个混淆器的使用方法、混淆效果和已知的一些bug。同时&#xff0c;我们也会给出一些示例来演示混淆器的具体操作。 引言 在信息竞赛训练和实际开发中&#xff0c;保护代码的安全性和…

ubuntu-22.04 tenda U9安装wifi驱动

背景 前面写过《ubuntu-18.04 tenda U9安装wifi驱动》&#xff0c;当然20.04也是支持的。 但是当系统升级为22.04.1之后&#xff0c;之前的已经不能用了&#xff0c;22.04.1的内核版本是6.5.0-26-generic&#xff0c;github上的代码(https://github.com/brektrou/rtl8821CU.g…

汇编程序设计

文章目录 第一章8086的存储器组织寻址方式立即数寻址方式寄存器寻址方式存储器寻址方式直接寻址方式寄存器间接寻址寄存器相对寻址方式寄存器基址变址寻址相对基址变址寻址相对方式的补充 数据寻址方式的组合 第一章 8086的存储器组织 存储单元的地址 “段基地址&#xff1a;段…

伪元素的使用

.box::after{content: ;display: block;// 定义元素位置margin-top: 12rpx;margin-right: 20rpx;// 定义元素宽高width: 36rpx;height: 36rpx;// background-image无法引用本地资源&#xff0c;故需要用网络地址background-image: url($urlcalendar.png);background-size: 100%…

Adobe AE(After Effects)2021下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

【C语言】每日一题,快速提升(2)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个…

《Java面试自救指南》(专题七)系统场景设计(含分布式、微服务)

文章目录 负载均衡如何实现,有哪几种方式谈谈你对微服务的理解SOA和微服务的区别CAP理论和BASE定理分布式系统需要考虑哪些问题分布式系统如何实现数据一致性如何实现分布式锁你的服务挂了怎么处理限流算法原理和应用分布式ID生成策略一致性算法(2/3pc, paxos, Raft, ZAB)淘…

error: failed to push some refs to ‘https://gitee.com/zhao-zhimin12/gk.git‘

git push origin master发现以下报错: 解决办法: 一、强制推送 git push origin master -f &#xff08;加上 -f 就是强制&#xff09; 二、 先拉取最新代码&#xff0c;再推送 1.git pull origin master 2.git push origin master

TransformerFAM: Feedback attention is working memory

TransformerFAM: Feedback attention is working memory 相关链接&#xff1a;arxiv 关键字&#xff1a;Transformer、Feedback Attention Memory (FAM)、working memory、long-context tasks、scaling laws 摘要 TransformerFAM是一种新型的Transformer架构&#xff0c;它通过…

保护视力,从 CareUEyes 开始 —— 你的电脑护眼小助手

在数字化时代&#xff0c;我们的眼睛比以往任何时候都更频繁地面对屏幕。长时间盯着电脑工作&#xff0c;不仅影响视力&#xff0c;还可能导致眼疲劳和不适。今天&#xff0c;我要向大家推荐一款专为电脑用户设计的护眼软件——CareUEyes。 CareUEyes&#xff1a;你的视力守护者…

Linux系统中LVM与磁盘配额

目录 一、LVM逻辑卷管理 二、LVM的管理命令 物理卷管理 卷组管理 逻辑卷管理 *创建并使用LVM步骤 三、磁盘配额概述 实现磁盘限额的条件 Linux 磁盘限额的特点 四、磁盘配额管理 磁盘限额 一、LVM逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#…

JavaScript数据类型 以及检测方法

在JavaScript中&#xff0c;数据类型是编程中非常重要的概念&#xff0c;它决定了数据的性质、如何存储以及如何操作这些数据。以下是JavaScript中的主要数据类型、它们的区别以及数据类型检测的方式的详细介绍。 JavaScript的主要数据类型 1. 原始数据类型&#xff08;Primi…

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

selenium反反爬虫,隐藏selenium特征

一、stealth.min.js 使用 用selenium爬网页时&#xff0c;常常碰到被检测到selenium &#xff0c;会被服务器直接判定为非法访问&#xff0c;这个时候就可以用stealth.min.js 来隐藏selenium特征&#xff0c;达到绕过检测的目的 from selenium import webdriver from seleniu…

Day 2 正式coding之基础模块的搭建

Day 2 正式coding之基础模块的搭建 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端…

Spring基础篇-快速面试笔记(速成版)

文章目录 1. Spring概述2. 控制反转&#xff08;IoC&#xff09;2.1 Spring声明Bean对象的方式2.2 Spring的Bean容器&#xff1a;BeanFactory2.3 Spring的Bean生命周期2.4 Spring的Bean的注入方式 3. Spring的事件监听器&#xff08;Event Listener&#xff09;3.1 Spring内置事…

自学Java的第二十四次笔记

一,方法重载 1.基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a; System.out.println(); out 是 PrintStream 类型 2.重载的好处 1) 减轻了起名的麻烦 2) 减轻了记名的麻烦 3.快速入门案…