Java:ArrayList与顺序表

news2024/9/23 22:43:39

一、线性表

线性表是n个具有相同特征的数据元素的有限序列,它是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列......

如图:顺序表与链表的区别看了标题的伙伴就应该知道,我们这次要讲解的主角是顺序表,所以链表等下次再来介绍了!

二、实现顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素数据结构,一般情况下采用数组存储,不过,它在数组上完成了数据的增删查改

1、实现过程中的各种文件

如图:为了是实现这个顺序表,我创建了一个arrayList包,这个包底下有三个文件:

IList接口、MyArrayLIst类、Test类。

ILIst接口:接口中包含实现数据增删查改的功能,当然,接口中的方法不需要具体实现!

MyArrayList类:这个类定义了数组这个成员变量,并且具体实现了接口中的每一种功能!

Test类:这个类主要是来使用这个数据结构的,里面包含main方法!



2、MyArist类:

MyArrayList 全部代码:

package arrayList;

import java.util.Arrays;

//具体实现接口中的功能
public class MyArrayList implements IList {
    //定义成员变量
    public int[] elem;
    public int useSize;

    //创建构造方法
    public MyArrayList(){
        this.elem=new int[10];
        this.useSize=0;
    }


    //在数组末尾添加数据
    public void add(int data){
        //判断数组是否满了?
        //未满:将数据存入数组elem[useSize]处,同时useSize++
        //满了:先扩容,再存放数据
        if(isFull()){
            //拷贝数组
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        this.elem[useSize]=data;
        useSize++;

    }
    //判断数组是否满了
    public boolean isFull(){
        return useSize==elem.length;
    }

    //在指定位置添加数据
    public void add(int data,int pos){
        //判断pos的合理性
       try{
           checkPos(pos);
       }catch (PosNotLegalException e){
           e.printStackTrace();
       }
        //判断数组是否满了
        if(isFull()){
            elem=Arrays.copyOf(elem,2*elem.length);
        }
        for (int i = useSize-1; i <=pos ; i++) {
            elem[i+1]=elem[i];
        }
        elem[pos]=data;
        useSize++;
    }

    //判断pos是否合法?
    private void  checkPos(int pos){
        if(pos<0||pos>useSize){
            throw new PosNotLegalException("pos不合法!");
    }
}
   //判断是否包含某个元素
    public boolean contains(int toFind){
        for (int i = 0; i < useSize; i++) {
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
    }

    //查找某个元素的位置
    public int indexOf(int toFind){
        for (int i = 0; i < useSize; i++) {
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }

    //获取pos位置的值
    public int get(int pos){
       try{
           checkPosGetAndSet(pos);
       }catch (PosNotLegalException e){
           e.printStackTrace();
       }
       return elem[pos];
    }

    //判断get 的pos是否合法?
    private void checkPosGetAndSet(int pos) {
        if(pos<0||pos>=useSize){
            throw new PosNotLegalException("pos不合法!");

        }
    }

    //打印顺序表:
    public void display(){
        for (int i = 0; i < useSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }

    //将pos位置的值设置为value
    public void set(int value,int pos){
        try{
            checkPosGetAndSet(pos);
        }catch (PosNotLegalException e){
            e.printStackTrace();
        }
        elem[pos]=value;
    }

    //去除指定元素
    public void toRemove(int toRemove){
        //如果找不到元素,返回
        int pos=indexOf(toRemove);
        if(pos==-1){
            return;
        }

        //如果找到,去除元素
        for (int i=pos;i<useSize-1;i++){
            elem[i]=elem[i+1];
        }
        useSize--;
    }

    //去除数组内容
    public void clear(){
        useSize=0;
    }
}

 

 在数组末尾增加数据:

在数组末尾增加数据的功能很简单:

它的逻辑是,先使用isFull方法判断数组空间是否满了?如果未满:将数据添加到elem[useSize]处,同时useSize++;如果满了,就先給数组扩容,再添加数据到数组末尾!

具体实现: 

//在MyArrlist类中:
 
 //在数组末尾添加数据
    public void add(int data){
        //判断数组是否满了?
        //未满:将数据存入数组elem[useSize]处,同时useSize++
        //满了:先扩容,再存放数据
        if(isFull()){
            //拷贝数组
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        this.elem[useSize]=data;
        useSize++;

    }
    //判断数组是否满了
    public boolean isFull(){
        return useSize==elem.length;
    }


 在指定位置插入数据:

在指定位置添加数据也不难,它的逻辑如下:只要我们将 从数组末尾到pos位置 的元素都往后挪动一个位置,到最后它就会将数组下标为pos的位置空出来,这样我们就可以添加我们需要添加的元素了!

 

但是在此之前,我们需要判断pos的合法性:

1、pos不能小于0,因为数组的下标最小为0

2、pos不能大于当前的useSize 

还有一种情况:当数组空间满了的情况下,要先给数组扩容

具体实现:

这里我实现了一个功能,如果输入的pos不合法:抛出异常!(异常的知识可以在我的其他文章中寻找)

那么,我们就需要另外创建一个异常类:

//在MyArrayList类中:
//在指定位置添加数据
    public void add(int data,int pos){
        //判断pos的合理性:如果不合理,抛出异常!
       try{
           checkPos(pos);
       }catch (PosNotLegalException e){
           e.printStackTrace();
       }
        //判断数组是否满了
        if(isFull()){
            elem=Arrays.copyOf(elem,2*elem.length);
        }
        for (int i = useSize-1; i <=pos ; i++) {
            elem[i+1]=elem[i];
        }
        elem[pos]=data;
        useSize++;
    }

    //判断pos是否合法?
    private void  checkPos(int pos){
        if(pos<0||pos>useSize){
            throw new PosNotLegalException("pos不合法!");
    }

这里给大家看看异常的效果:如果输入的pos不合法:



判断是否包含某个元素:

这个方法的主要逻辑是:通过循环遍历数组,如果找到要查找的元素,返回true,否则返回false 

具体实现: 

//在MyArrayList类中
//判断是否包含某个元素
    public boolean contains(int toFind){
        for (int i = 0; i < useSize; i++) {
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
    }


 查找某个元素的位置:

 这个方法的主要逻辑是:通过循环遍历数组,如果找到要查找的元素,返回其下标,否则返回一个负数

具体实现:

//在MyArrayList类中:
//查找某个元素的位置
    public int indexOf(int toFind){
        for (int i = 0; i < useSize; i++) {
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }



获取pos位置的值:

这个方法的逻辑很简单:先判断传入的pos是否合法?不合法则抛出异常!合法则返回该下标的数组元素的值! 

具体实现: 

//在MyArrayList类中: 
//获取pos位置的值
    public int get(int pos){
       try{
           checkPosGetAndSet(pos);
       }catch (PosNotLegalException e){
           e.printStackTrace();
       }
       return elem[pos];
    }

    //判断get 的pos是否合法?
    private void checkPosGetAndSet(int pos) {
        if(pos<0||pos>=useSize){
            throw new PosNotLegalException("pos不合法!");

        }
    }


打印顺序表:

具体实现: 

//在MyArrayList类中:  
//打印顺序表:
    public void display(){
        for (int i = 0; i < useSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }



将pos位置的值设置为value:

具体实现: 

//在MyArrayList类中:
 //将pos位置的值设置为value
    public void set(int value,int pos){
        try{
            checkPosGetAndSet(pos);
        }catch (PosNotLegalException e){
            e.printStackTrace();
        }
        elem[pos]=value;
    }



去除pos位置的元素:

该方法的逻辑如下:

1、先看看能不能找到你要查找的元素,如果不能找到,return

     如果可以找到,去除元素

2、去除元素原理:

从pos位置的元素开始,依次使当前元素的值等于下一个元素的值,然后i加1,直到i<useSIze

具体实现:

 //去除指定元素
    public void toRemove(int toRemove){
        //如果找不到元素,返回
        int pos=indexOf(toRemove);
        if(pos==-1){
            return;
        }

        //如果找到,去除元素
        for (int i=pos;i<useSize-1;i++){
            elem[i]=elem[i+1];
        }
        useSize--;
    }


去除数组:

 具体实现:

//去除数组内容
    public void clear(){
        useSize=0;
    }



3、IList接口:

package arrayList;


//在这个接口实现数据的增删查改操作
public interface IList {
    //在数组末尾增加数据
    void add(int data);
    boolean isFull();

    //在指定位置添加元素
    void add(int data,int pos);

    //判断是否包含某个元素
     boolean contains(int toFind);

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

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

     //打印顺序表:
    void display();

    //将pos位置的值设置为value
     void set(int value,int pos);

    //去除指定元素
    void toRemove(int toRemove);

    //去除数组内容
    void clear();
}

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

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

相关文章

Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

router.push是同步还是异步?push.then和子组件onMounted谁先触发?

直接做实验&#xff1a; <el-button type"danger" click"test">toAbout</el-button>// -----const test () >{router.push(about).then((e)>{console.log(then里面, e);}).finally((e)>{console.log(finally里面, e);})console.log…

【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 宠粉博主又来了&#xff0c;今天有粉丝问我如何实…

机器学习 - 神经网络分类

什么叫做分类问题&#xff1f; A classification problem involves predicting whether something is one thing or another. Problem typeWhat is it?ExampleBinary classificationTarget can be one of two options, e.g. yes or noPredict whether or not someone has hea…

AXI_Lite协议详解

文章目录 摘要一、AXI_Lite接口全局信号&#xff1a;1、写地址通道&#xff1a;2、写数据通道&#xff1a;3、写响应通道&#xff1a;4、读地址通道&#xff1a;5、读数据通道&#xff1a; 二、仿真波形 摘要 AXI4-lite是AXI4-full的简化版。用于简单、低吞吐量的内存映射通信…

基于CNN-RNN的动态手势识别系统构建与应用

一、引言 随着人机交互技术的不断发展&#xff0c;动态手势识别成为了近年来的研究热点。动态手势识别技术能够识别和理解人类的手势动作&#xff0c;从而实现更自然、更直观的人机交互。本文旨在构建一种基于CNN-RNN的动态手势识别系统&#xff0c;以提高手势识别的准确性和实…

36.基于SpringBoot + Vue实现的前后端分离-高校汉服租赁网站系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的高校汉服租赁网站系统设计与实现管理…

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…

Filter、Listener、AJAX

Filter 概念&#xff1a;Filter 表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、统一编码处理、敏感…

Mac 装 虚拟机 vmware、centos7等

vmware&#xff1a; https://www.vmware.com/products/fusion.html centos7 清华镜像&#xff1a; 暂时没有官方的 m1 arm架构镜像 centos7 链接: https://pan.baidu.com/s/1oZw1cLyl6Uo3lAD2_FqfEw?pwdzjt4 提取码: zjt4 复制这段内容后打开百度网盘手机App&#xff0c;操…

【Python】Scrapy整合FastAPI实现爬虫API 附大量示例

文章目录 前言1. 网页分析入门1.1 基本原理1.2 Scrapy 原理 2. 创建项目2.1 创建Scrapy项目2.2.1 创建Scrapy项目2.2.2 创建Spider2.2.3 执行Demo 2.2 引入FastAPI 2. 获取Cookie3. 数据建模3.1 Scrapy 数据建模3.2 SQLAlchemy 创建实体类 3. 分析网页3.1 xpath 分析3.2 css 分…

计算机进制转换:二进制、八进制、十进制、十六进制。原码、补码、反码。

一、什么是进制 在生活中&#xff0c;我们通常都是使用阿拉伯数字计数的&#xff0c;也就是10进制&#xff0c;以10为单位&#xff0c;遇10进一&#xff0c;所以是由0&#xff0c;1&#xff0c;2、3、4、5、6、7、8、9组成的&#xff1b;而在计算机中&#xff0c;计算机是无法…

AI工具排行榜:最全工具汇总

如今,人工智能技术正在快速崛起,AI助手、语音识别、机器翻译等工具深深渗透到我们的工作和生活中。这些智能工具极大地提高了我们的工作效率,使我们能更加专注于创造性的任务。 本文将为读者推荐一些实用的AI神器,只要掌握其中一个,就能极大地提升你的工作能力,事半功倍。这些…

YOLOv9代码解读[01] readme解读

文章目录 YOLOv9COCO数据集上指标&#xff1a;环境安装训练验证重参数化 Re-parameterization推断相关链接 YOLOv9 paper: YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information github: https://github.com/WongKinYiu/yolov9 COCO数据集上指…

如何使用Python进行网络安全与密码学【第149篇—密码学】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 用Python进行网络安全与密码学&#xff1a;技术实践指南 随着互联网的普及&#xff0c;网络…

CSS(四)

一、CSS浮动 1.1 传统网页布局的三种方式 网页布局的本质——用 CSS 来摆放盒子。 把盒子摆放到相应位置. CSS 提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序)&#xff1a; 普通流&#xff08;标准流&#xff09; 浮动 定位 1.2 标准流&#xff08;普通流/文档…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

基于React的低代码平台开发实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;在线地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

day07-缓存商品、购物车

1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓…

Java 在PDF中插入页眉、页脚

在处理PDF文档时&#xff0c;有时需要为文档中的每一页添加页眉和页脚&#xff0c;以包含一些有用的信息&#xff0c;如文档标题、章节名称、日期、页码等。对于需要自动化处理的场景&#xff0c;或者需要在大量文档中添加一致的页眉和页脚&#xff0c;可以通过编程的方式来实现…