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

在介绍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); //删除第一次出现的关键字key
    
    void 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;
    }

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

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

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

相关文章

7 pytorch DataLoader, TensorDataset批数据训练方法

前言 本文主要介绍pytorch里面批数据的处理方法&#xff0c;以及这个算法的效果是什么样的。具体就是要弄明白这个批数据选取的算法是在干什么&#xff0c;不会涉及到网络的训练。 from torch.utils.data import DataLoader, TensorDataset主要实现就是上面的数据集和数据载入…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接&#xff1a;Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好&#xff0c;我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的&#xff0c;它是一种点对点的通信技术&#xff0c;通过浏览器之间建立对等连接&#xff0c;实现音频…

InfiniGate自研网关实现思路一

1.HTTP请求会话协议处理 运用Netty对HTTP请求信息的协议转换&#xff0c;构建网关会话服务&#xff0c;简单响应HTTP请求信息到页面。 之所以称之为会话&#xff0c;是因为一次 HTTP 请求&#xff0c;就要完成&#xff1b;建立连接、协议转换、方法映射、泛化调用、返回结果等…

吃透2000-2024年600道真题和解析,科学高效通过2025年AMC8竞赛

为帮助孩子科学、有效备考AMC8竞赛&#xff0c;我整理了2000-2004年的全部AMC8真题&#xff08;完整版共600道&#xff0c;且修正了官方发布的原试卷中的少量bug&#xff09;&#xff0c;并且独家制作成多种在线练习&#xff0c;利用碎片化时间&#xff0c;8个多月的时间足以通…

【Redis 神秘大陆】008 常见Java客户端

八、Redis 的 Java 客户端 8.1 Jedis 连接池 单点连接池 Jedis 连接池基于 Common-Pool 连接池里面放置的是空闲连接&#xff0c;如果被使用 &#xff08;borrow&#xff09;掉&#xff0c;连接池就会少一个连接&#xff0c;连接使用完后进行放回 &#xff08;return&#…

HCIA-Datacom实验_05_实验三:OSPF路由协议基础实验

一、实验拓扑 二、实验步骤 (一)修改设备名称、配置接口IP、Loopback口IP R1 R2 R3 (二)配置OSPF R1 R2 R3 (三)配置认证 R1 R2 R3

【学习笔记八】EWM仓库流程类型的后台配置和前台测试

一、仓库流程类型概述 仓库流程类型&#xff08;Warehouse Process Types&#xff09;&#xff0c;简称WPT 在SAP扩展仓库管理(SAPEWM)中&#xff0c;WPT控制仓库内每个流程的活动或移动&#xff08;如收货、发货、过帐更改&#xff09;。仓库流程类型被分配给每个仓库请求项目…

【机器学习】贝叶斯算法在机器学习中的应用与实例分析

贝叶斯算法在机器学习中的应用与实例分析 一、贝叶斯算法原理及重要性二、朴素贝叶斯分类器的实现三、贝叶斯网络在自然语言处理中的应用四、总结与展望 在人工智能的浪潮中&#xff0c;机器学习以其独特的魅力引领着科技领域的创新。其中&#xff0c;贝叶斯算法以其概率推理的…

1、MYSQL系列-深入理解Mysql索引底层数据结构与算法

索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构 二叉树红黑树Hash表BTree B-Tree B-Tree 叶节点具有相同的深度&#xff0c;叶节点的指针为空&#xff0c;所有索引元素不重复&#xff0c;节点中的数据索引从左到右递增排列 BTree(B-Tree变种) 非叶…

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面&#xff0c;用于管理和开发各种关系型数据库&#x…

Linux内核之WRITE_ONCE用法实例(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

stm32实现hid键盘

前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码&#xff1a; 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…

深度学习 Lecture 7 迁移学习、精确率、召回率和F1评分

一、迁移学习&#xff08;Transfer learning) 用来自不同任务的数据来帮助我解决当前任务。 场景&#xff1a;比如现在我想要识别从0到9度手写数字&#xff0c;但是我没有那么多手写数字的带标签数据。我可以找到一个很大的数据集&#xff0c;比如有一百万张图片的猫、狗、汽…

基于Adaboost模型的数据预测和分类matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种集成学习方法&#xff0c;由Yoav Freund和Robert Schapire于1995年提出&#xff0c;主要用于提高弱分类…

UML 介绍

前言 UML 简介。 文章目录 前言一、简介1、事务2、关系1&#xff09;依赖2&#xff09;关联聚合组合 3&#xff09;泛化4&#xff09;实现 二、类图三、对象图四、用例图五、交互图1、序列图&#xff08;顺序图&#xff09;2、通信图 六、状态图七、活动图八、构件图&#xff0…

详解UART通信协议以及FPGA实现

文章目录 一、UART概述二、UART协议帧格式2.1 波特率2.2 奇校验ODD2.3 偶校验EVEN 三、UART接收器设计3.1 接收时序图3.2 Verilog代码3.3 仿真文件测试3.4 仿真结果3.5 上版测试 四、UART发送器设计4.1 发送时序图4.2 Verilog代码4.3 仿真文件测试4.4 仿真结果4.5 上板测试 五、…

HarmonyOS开发实战:【亲子拼图游戏】

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式益智拼图游戏&#xff0c;可以两台设备同时开启一局拼图游戏&#xff0c;每次点击九宫格内的图片&#xff0c;都会同步更新两台设备的图片位置。效果图如下&#xff1a; 说明&#xff1a; 本示例涉及使…

2016NOIP普及组真题 1. 金币

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1969 核心思想&#xff1a; 解法1、由于数据量只有 10000 天&#xff0c;估可以采用 模拟每一天 的方式。 #include <bits/stdc.h> using namespace std;int k 0;int main() {i…

SpringBoot项目基于java的教学辅助平台

采用技术 SpringBoot项目基于java的教学辅助平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 学生信息管理 教师信息管理 课程信息管理 科目分类管…

【面试经典 150 | 链表】K 个一组翻转链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…