Java顺序表(1)

news2024/12/23 17:58:43

🐵本篇文章将对顺序表中的方法进行模拟实现


一、线性表

线性表是指在逻辑结构上呈连续的线性结构,而在物理结构上不一定是连续的结构,常见的线性表有:顺序表、链表、栈、队列等

二、顺序表

顺序表一般采用数组来存储数据,因此它是一种逻辑结构上连续,在物理结构上也连续的数据结构,下面对顺序表的增删查改等操作用Java进行具体实现

先实现一个接口,在这个接口写上要实现的方法:

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); //删除第一次出现的关键字toRemove
 
    int size(); // 获取顺序表长度

    void clear(); // 清空顺序表

    void display(); // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
}

之后再创建一个MyArrayList类实现上述接口并重写接口中所有的方法

public class MyArrayList implements IList{
    public int[] elem; //存储数据

    public int usedSize; //已经放入顺序表中数据的个数

    public static final int DEFAULT_CAPACITY = 5; //顺序表中默认容量的大小为5
    
    public MyArrayList() {
        elem = new int[DEFAULT_CAPACITY];
    }

    /*以下是要重写IList接口中的方法*/
    ...

}

2.1 方法的实现

void add(int data); // 新增元素,默认在数组尾部新增

在数组的尾部新增一个元素,之前的ArrayList类中有一个变量为usedSize,用于记录顺序表中已存数据的个数,刚开始存入数据的时候usedSize为0,那么每次向数组中存入一个数据,usedSize就加1

public void add(int data) {
    elem[usedSize] = data;
    usedSize++;
}

写到这里还要考虑一个问题:如果数组满了怎么办,我们前面定义了数组的默认大小为5,如果已经向数组中存入了5个数据在存数据的话,就会抛出数组越界异常,所以在向数组中新增元素时要先判断一下数组满没满,如果满了则要扩容,然后再新增元素

public void add(int data) {
    if (usedSize == elem.length) {
        elem = Arrays.copyOf(elem, elem.length * 2);
    }

    elem[usedSize] = data;
    usedSize++;
}

Arrays.copyOf的方法定义如下:

public static int[] copyOf(int[] original, int newLength)

int[] original为源数组,newLength为该数组的新长度


void add(int pos, int data); // 在 pos 位置插入元素

那么接下来有一个问题,这些元素怎么移动?是从后往前移动还是从前往后移动,答案是从后往前移动,因为如果从前往后移动的话,先将2放在了3的位置处,如果再要将3移动到4位置时发现3已经被2覆盖了,所以要从5开始倒着依次向后移动

public void add(int pos, int data) {

    for (int i = usedSize; i >= pos; i--) {
               //循环条件为i >= pos,因为pos位置处的元素也要往后移动
        elem[i] = elem[i - 1];
    }

    elem[pos] = data; //移动完后,直接再pos位置处插入新增元素
}

写到这里后还要考虑两点:1.pos位置是否合法;2. 此时数组有没有满

先来看第一个:pos位置是否合法,这个很简单,我们可以在第一句加上一个判断pos的方法,如果pos不合法则抛出一个异常使程序终止

public class EmptyException extends RuntimeException{
    public EmptyException(String message) {
        super(message);
    }
}

========================================================

private void checkPosAdd(int pos) {
    if (pos < 0 || pos >= usedSize + 1) {
    //数组的下标不能为0;在一个位置插入后,必须是连续的因为前面说过顺序表在物理结构上也是连续的
        throw new PosException("下标错误");
    }
}

判断数组满没满跟之前一样,以下是该方法的最终实现:

public void add(int pos, int data) {
    checkPosAdd(pos);

    if (usedSize == elem.length) {
        elem = Arrays.copyOf(elem, 2 * elem.length);
    }

    for (int i = usedSize; i >= pos; i--) {
        elem[i] = elem[i - 1];
    }

    elem[pos] = data;
    usedSize++;
}

boolean contains(int toFind); // 判定数组中是否包含某个元素

实现这个方法很简单,只需要遍历一遍数组即可

public boolean contains(int toFind) {

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

    return false;
}

int indexOf(int toFind); // 查找某个元素对应的位置

同样,这个方法也遍历一遍数组即可

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

    return -1; //如果没有这个元素,返回-1
}

int get(int pos); // 获取 pos 位置的元素

要先判断一下pos位置是否合法

private void checkPosGet(int pos) {
    if (pos < 0 || pos >= usedSize) {
              //这里pos >= usedSize 的原因是usedSize代表当前已存数据的个数,该位置还没有放元素
        throw new PosException("下标错误");
    }
}

get方法的最终实现:

public int get(int pos) {
    checkPosGet(pos);
    return elem[pos];
}

void set(int pos, int value); // 给 pos 位置的元素设为 value

该方法的实现和get方法几乎一致

public void set(int pos, int value) {
    checkPosGet(pos);
    elem[pos] = value
}

void remove(int toRemove); //删除第一次出现的关键字toRemove

在移动元素之前,要先得到toRemove的下标,可以直接利用刚刚实现的indexOf方法,得到下标后开始移动元素,移动完元素就相当于已经将toRemove删除了,那么让usedSize减1

public void remove(int toRemove) {

    int pos = indexOf(toRemove);
    for (int i = pos; i < usedSize - 1; i++) {
        elem[i] = elem[i + 1];
    }

    usedSize--;
}

在方法的开始还要判断一下数组是否为空,如果为空则不能删除,可以抛出一个异常

public class EmptyException extends RuntimeException{
    public EmptyException(String message) {
        super(message);
    }
}

=======================================================

public void remove(int toRemove) {
    if (usedSize == elem.length) {
        throw new EmptyException("顺序表为空");
    }

    int pos = indexOf(toRemove);

    for (int i = pos; i < usedSize - 1; i++) {
        elem[i] = elem[i + 1];
    }

    usedSize--;
}

int size(); // 获取顺序表长度

直接返回usedSize即可

int size() {
    return usedSize;
}

void clear(); // 清空顺序表

具体实现:

    public void clear() {
        usedSize = 0; //这里的顺序表中放的都是int类型而非引用类型,所以,不用将每个元素置空
                //如果顺序表中的元素都是引用类型则应遍历数组,将每个元素置空,再将usedSize置为0                                                         
    }


void display(); // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的

遍历数组并打印即可:

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

🙉本篇文章到此结束,下一篇文章将对ArrayList进行讲解

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

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

相关文章

C++——map和set的基本使用

目录 一&#xff0c;关联式容器 二&#xff0c;键值对 三&#xff0c;set的使用 3.1 set介绍 3.2 set的插入和删除 3.3 set的pair 3.4 multiset 四&#xff0c;map的使用 4.1 map介绍 4.2 map实现简易字典 4.3 map实现统计次数 4.4 map的[] 五&#xff0c;使用map或…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

暴雨信息发布算力网络应用平台打造零感知算网服务新模式

为进一步优化算力网络应用服务能力和降低算力网络使用难度&#xff0c;暴雨信息突破基于算力网络的实例跨域协同与迁移、基于测试评估的应用度量和解构等技术&#xff0c;研发并推出算力网络应用平台。该系统通过提供一种即开即用、按需付费的零感知算网应用服务&#xff0c;使…

捕捉小红书开年顶流,品牌快“跟风”上车!

2024年开年&#xff0c;“南方小土豆”纷纷北上&#xff0c;元旦期间哈尔滨收入近60亿元&#xff0c;“冰雪”一跃成为今冬最炙手可热的流行趋势&#xff01; 千瓜数据显示&#xff0c;小红书“冰雪”相关商业笔记同比去年增长649.84%。本期&#xff0c;千瓜将从“冰雪”场景出…

离散数学-二元关系

4.1关系的概念 1)序偶及n元有序组 由两个个体x和y&#xff0c;按照一定顺序排序成的、有序数组称为有序偶或有序对、二元有序组&#xff0c; 记作<x&#xff0c;y>&#xff0c;其中x是第一分量&#xff0c;y是第二分量。 相等有序偶&#xff1a;第一分量和第二分量分…

Excel·VBA按指定顺序排序函数

与之前写过的《ExcelVBA数组冒泡排序函数》不同&#xff0c;不是按照数值大小的升序/降序对数组进行排序&#xff0c;而是按照指定数组的顺序&#xff0c;对另一个数组进行排序 以下代码调用了《ExcelVBA数组冒泡排序函数》bubble_sort_arr函数&#xff08;如需使用代码需复制…

EasyPOI导出报表

报表导出是一种很常见的功能&#xff0c;只要是开发都会涉及到这一功能&#xff0c;早些年经常集成poi完成导出功能&#xff0c;我之前也有写过关于poi导出的文章&#xff0c;现如今&#xff0c;也有了更为方便的导出插件 — EasyPOI&#xff0c;废话不多说&#xff0c;开始撸代…

内网渗透实战攻略

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网&#xff1f; 什么是内网渗透&#xff1f; 内网渗透的目的&#xff1a; 内网…

el-table实现多行合并的效果,并可编辑单元格

背景 数据为数组包对象&#xff0c;对象里面有属性值是数组&#xff1b;无需处理数据&#xff0c;直接使用el-table包el-table的方法&#xff0c;通过修改el-table的样式直接实现多行合并的效果 html代码 <template><div><el-table size"mini" :d…

Python基础知识:整理9 文件的相关操作

1 文件的打开 # open() 函数打开文件 # open(name, mode, encoding) """name: 文件名&#xff08;可以包含文件所在的具体路径&#xff09;mode: 文件打开模式encoding: 可选参数&#xff0c;表示读取文件的编码格式 """ 2 文件的读取 文…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式&#xff08;Specification Pattern&#xff09;是一种行为设计模式&#xff0c;其目的是将业务规则封装成可重…

【笔记】书生·浦语大模型实战营——第三课(基于 InternLM 和 LangChain 搭建你的知识库)

【参考&#xff1a;tutorial/langchain at main InternLM/tutorial】 【参考&#xff1a;(3)基于 InternLM 和 LangChain 搭建你的知识库_哔哩哔哩_bilibili-【OpenMMLab】】 笔记 基础作业 这里需要等好几分钟才行 bug&#xff1a; 碰到pandas相关报错就卸载重装 输出文字…

【野火i.MX6ULL开发板】开发板连接网络(WiFi)与 SSH 登录、上电自动登录、设置静态IP、板子默认参数

0、前言 参考之前自己写的&#xff1a; http://t.csdnimg.cn/g60P8 参考资料&#xff1a; [野火]《Linux基础与应用开发实战指南——基于i.MX6ULL开发板》_20230323 从野火官网下载 参考博客&#xff1a; http://t.csdnimg.cn/8uh4O 参考官方文档&#xff1a; https://doc.…

【算法每日一练]-练习篇 #Tile Pattern #Swapping Puzzle # socks

目录 今日知识点&#xff1a; 二维前缀和 逆序对 袜子配对(感觉挺难的&#xff0c;又不知道说啥) Tile Pattern Swapping Puzzle socks Tile Pattern 331 题意&#xff1a;有一个10^9*10^9的方格。W表示白色方格&#xff0c;B表示黑色方格。每个(i,j)方的颜色由(i…

PowerDesigner简介以及简单使用

软件简介&#xff1a; PowerDesigner是Sybase公司开发的数据库设计工具&#xff0c;开发人员能搞利用PowerDesigner开发数据流程图、各数据模型如物理数据模型&#xff0c;可以分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库…

一点一点,照亮你的美

一、实验要求 当鼠标点击屏幕时&#xff0c;随机出现大大小小的星星闪烁&#xff0c;犹如夜晚的星空 二、实验思路 设置图片的大小 设置事件&#xff08;当鼠标点一下&#xff0c;获取一张图片&#xff09; 设置图片的位置 设置鼠标的位置和图片的相对位置 设置随机大小 …

如何使用GaussDB创建脱敏策略(MASKING POLICY)

目录 一、前言 二、GaussDB中的脱敏策略 1、数据脱敏的定义 2、创建脱敏策略的语法说明 三、在GaussDB中如何创建数据脱敏策略(示例) 1、创建脱敏策略的一般步骤 2、GaussDB数据库中创建脱敏策略的完整示例 1&#xff09;开启安全策略开关&#xff0c;以初识用户omm登录…

这6个设计小白学习网站,海量免费学习教程!

划到最后“阅读原文”——领取工具包&#xff08;超过1000工具&#xff0c;免费素材网站分享和行业报告&#xff09; Hi&#xff0c;我是胡猛夫~&#xff0c;专注于分享各类价值网站、高效工具&#xff01; ​更多资源&#xff0c;更多内容&#xff0c;欢迎交流&#xff01;公…

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围&#xff08;最小0&#xff0c;最大150&#xff09; //指定输入框&#xff0c;拥有5行 //默认…

寄快递选哪个平台便宜?快递优惠券免费领取!

寄快递选哪个平台便宜&#xff1f;快递优惠券免费领取&#xff01; 对于市场来说&#xff0c;快递业是非常重要的一部分&#xff0c;它业既贯通市场流通消费投资出口的各环节&#xff0c;又关联一二三各产业。根据相关数据显示&#xff0c;我国的快递行业正呈现势如破竹的劲头&…