ArrayList和顺序表

news2024/11/25 14:21:17

目录

线性表

顺序表

实现顺序表:

1,添加元素的时候我们要判断是否需要扩容

2,写异常

3,数组清空

ArrayList:

ArrayList的构造方法:

ArrayList的add方法:

ArrayList的subList

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

二维数组:


线性表

就是n个相同类型的数据有序排列;常见的有:顺序表,链表。栈,队列等

顺序表

实现顺序表:

为了更好的掌握ArrayList我们先来定义一个顺序表和接口,用顺序表这个类去实现接口,并重写接口中的所有方法;大家先来自己思考实现。顺序表最基础的两个属性就是数组和有效数组元素的大小

所需要实现的方法:

 // 新增元素,默认在数组最后新增
    public void add(int data);
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind);
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove);
    // 获取顺序表长度
    public int size();
    // 清空顺序表
    public void clear() ;
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() ;

重写方法的代码:(由于代码较长,博主觉得不适合全部放在这里,因为后面学习二叉树等时候代码会更长,但出于详细,才放这里,后面可能不放了(可以看gitee),所以路过的小伙伴可以给博主提建议(放还是不放))

import java.util.Arrays;

public class MyArray implements IExcese{
    public int[] array = {};
    public int size = 0;
    public static final int INIT_SIZE = 5;

    @Override
    //要判断给出的下标是否合理所以我们要来抛出异常
    public void add(int data) {
        array = capitalArray();
        array[size] = data;
        size++;

    }

    @Override
    //注意增加的元素不能隔空增加,比如3没有添加元素就直接在4下标添加,add可以理解为插入
    public void add(int pos, int data) {
        array = capitalArray();
        if(pos<size && pos>=0) {
            int mark = data;
            for(int i = size - 1;i>pos;i--) {
                array[i] = array[i - 1];
            }
            array[pos] = data;
            size++;
        }else {
            throw new DataOverException("数组下标不符合规范");
        }


    }

    @Override
    public boolean contains(int toFind) {
        for(int i = 0; i<size;i++) {
            if(array[i] == toFind) {
                System.out.println("下标位置为:" + i);
                return true;
            }
            return false;

        }
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < size; i++) {
            if (array[i] == toFind) {
                return i;
            }

        }
        return -1;
    }

    @Override
    public int get(int pos) {
        if(pos<0 ||pos>=size) {
            throw new DataOverException("下表不合理");
        }else{
            return array[pos];
        }

    }

    @Override
    public void set(int pos, int value) {
        if(pos<0 ||pos>=size) {
            throw new DataOverException("下表不合理");
        }else{
            array[pos]  = value;
        }

    }

    @Override
    public void remove(int toRemove) {
        int mark = 0;
        int i;
        for(i =0;i<size;i++) {
            if(array[i] == toRemove) {
                mark = 1;
            }
            }
        if(mark ==1) {
            for (int j = i; j < size-1; j++) {
                array[i] = array[i+1];
            }
            size--;
        }else{
            System.out.println("没有该元素");
        }

    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public void clear() {
        for (int i =0 ;i<size;i++) {
            array[i] = null;
        }
        size = 0;

    }

    @Override
    public void display() {
        for(int i = 0;i < size; i++) {
            System.out.println(array[i]);
        }

    }

    @Override
    public String toString() {
        return "MyArray{" +
                "array=" + Arrays.toString(array) +
                ", size=" + size +
                '}';
    }
    private int[] capitalArray() {
        if (size == 0 ) {
            return new int[INIT_SIZE];

        }
        else if(size == array.length) {
            int newSize = size + 5;
            //扩容数组,返回一个新数组
             array = Arrays.copyOf(array,newSize);
             return array;
        } else {
            return array;
        }
    }
}

大部分代码都比较为简单,我们挑几个来说就行;

1,添加元素的时候我们要判断是否需要扩容

扩容需要的方法Arrays.copyOf(),填两个参数,原数组和需要扩容元素的个数,返回的是原数组类型;

同时在指定位置添加的时候,要将元素后移;还要判断数组下标是否合理,不能小于0也不能大于等于size;

2,写异常

当下标不符合要求的时候我们可以写异常来抛出

3,数组清空

防止资源浪费我们要清空数组,由于数组是引用类型,所以我们清空的时候要将数组赋值为null

ArrayList:

ArrayList就类似数组,但为什么还有创建这个类,是因为当我们需要知道并运用这个数组的有效存储元素时,数组是无法满足的(比如数组整体有五个元素的大小,但实际上只存储了三个元素),而且ArrayList当中有很多方法可以使用;

同时ArrayList是泛型类,意味着你可以定义任意类型的数组

ArrayList的方法:

ArrayList方法的使用就和咱们实现的顺序表差不多,要想更加了解这个类当我们就要看其源码(最开始看源码是一件比较痛苦的事,但是我们必须要学会去了解以及深刨,而且上面顺序表的实现也很重要为了更好理解源码)

ArrayList的构造方法:

ArrayList有三个构造方法

1,带一个参数:

2 不带参数

这些字段均是ArrayList的属性

不带参数的时候创建一个空数组;此时没有给数组分配空间(使用add会分配);

3 参数为数组:

我们来解释一下这个参数是什么意思:
c是变量名,Collection要求传入的参数必须是Collection类型或者其子类,<? extends E>中?是通配符的意思,意思是传入的参数还必须是E或者E的子类,而E又指的是,泛型中传入的类型;

我们通过代码来更好地理解一下:其中<>中传入的类型就代表E,()中传入的数组就代表?;ArrayList是Collection的子类,所以arrayList满足第一个条件,arrayList中的元素均是String类型的,所以当传入参数的元素类型是String或者其子类的时候就可以编译成功;而第三行的E是Integer类型,String不是Integer的子类因此编译失败

ArrayList的add方法:

这是add的源码,其中调用的字段都在上张图有显示所以可以对照来看;

整个代码的思路是:

1 是否初始化,如果没有那么返回一个大小为10的数组;

2 如果初始化那么判断数组是否需要扩容,如果不需要那么返回原数组;如果需要那么进行扩容,在最后一步中判断是否扩容后数组元素是否超过了int的最大值,如果没有,那么扩容成功

3 每次扩容的时候会扩大1,5倍,x>>1,x这个值向右移1相当于除以2;

ArrayList的subList

传入两个参数,第一个是数组的起始下标,第二个是终点下标(左闭右开),相当于字符串的截取。但与字符串不同的是,字符串的改变是产生新的对象,但是subList截取后的数组和原数组指向的是同一个对象,因此改变其中一个数组的值另一个数组也会改变。

subList的返回类型是List,List是ArrayList的实现接口;

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

1 重写toString后可以通过sout传入对象打印

2用for打印;

3用foreach这里包装类类型可以用基础类型接收,因为会自动拆包

4 迭代器,这里有个印象就行

二维数组:

ArrayList<ArrayList<Integer>>or<List<List<Integer>>>是二维数组,ArrayList的每个元素都是ArrayList<Integer>类型;

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

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

相关文章

GOAT:多模态、终身学习、平台无关的机器人通用导航系统

机器人应用中涉及到的核心技术包括&#xff1a;环境感知与理解、实时定位与建图、路径规划、行为控制等。GOAT通过多模态结合终生学习的方式让你的机器人可以在未知环境中搜索和导航到任何物体。小白也可以零门槛上手。 项目地址&#xff1a;https://theophilegervet.github.i…

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符&#xff1a;匹配的是文件名 正则表达式&a…

【Java学习笔记】73 - 正则表达式

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter27/src/com/yinhai/regexp 一、引入正则表达式 1.提取文章中所有的英文单词 2.提取文章中所有的数字 3.提取文章中所有的英文单词和数字 4.提取百度热榜标题 正则表达式是处理文本的利器…

Python实现视频人脸检测识别功能

目录 一、引言 二、人脸检测识别技术概述 三、Python实现视频人脸检测识别功能的步骤 1、安装相关库和工具 2、加载视频文件 3、人脸检测和识别 4、保存视频结果 四、实验结果和讨论 五、结论 一、引言 在当今社会&#xff0c;人脸检测识别技术在安全监控、人机交互、…

untiy 配置iis服务器来打开webgl

最简单的方法是不需要配置服务器&#xff0c;打包的时候直接build and run&#xff0c;但是有时候如果我们需要调整js的内容&#xff0c;会很不方便&#xff0c;所以配置一个iis服务器还是很有必要的 首先要开启iis服务 控制面板&#xff0c;查看方式选类型&#xff0c;点击程…

windows11 phpstudy_pro php8.2 安装redis扩展

环境&#xff1a;windows11 phpstudy_pro php8.2.9 一、命令查看是否安装redis扩展 在对应网站中通过打开&#xff0c;&#xff0c;选择对应的PHP版本&#xff0c;用命令 php -m 查看自己的php 有没有redis扩展 上面如果有&#xff0c;说明已经安装了,如果没有安装&#xff1…

TypeScript枚举

1、数字枚举 enum Direction {Up,Down,Left,Right, } var Direction; (function (Direction) {Direction[Direction["Up"] 0] "Up";Direction[Direction["Down"] 1] "Down";Direction[Direction["Left"] 2] "L…

vue elementUI 自定义框组织树,选择select下拉组织树横行滑动条出现方法

背景&#xff1a;最近公司开发需要使用到组织树进行组织结构的选择&#xff0c;在开发途中遇到两个次组织树已超过外框&#xff0c;但超出部分不显示横向滑动条。 自定义组织树框代码如下&#xff1a; <el-row><el-col :span"20" style"padding: 0px…

【开题报告】海洋多源数据质量控制应用服务的WebServer设计与实现

开 题 报 告 内 容 论文选题的意义、主要研究内容和文献资料调研情况 一、选题意义 在当今世界研究自然环境的大背景下&#xff0c;计算机技术与各学科、各领域的综合应用逐渐增多。作为地球上最广阔的水体&#xff0c;同时也是地球上决定气候发展的主要的因素之一&#xff0…

Umi-OCR图片批量识别文字工具

OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片&#xff0c;段落排版/排除水印&#xff0c;扫描/生成二维码。内置多国语言库。 项目地址&#xff1a;https://github.com/hiroi-sora/Umi-OCR

【开源】基于Vue+SpringBoot的学校热点新闻推送系统

项目编号&#xff1a; S 047 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S047&#xff0c;文末获取源码。} 项目编号&#xff1a;S047&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

微信小程序生成二维码并保存到本地方法

微信小程序生成二维码请保存到本地方法 官方weapp-qrcode插件 github链接 功能完成样子 wxml <view class"qrcode"><canvas style"width: 275px; height: 275px;" canvas-idmyQrcode></canvas> </view> <view class" …

[个人笔记] vCenter6.7使用自建SSL证书

SSL - 运维篇 第三章 vCenter6.7使用自建SSL证书 SSL - 运维篇系列文章回顾vCenter6.7使用自建SSL证书vCenter 6.7 上传文件到ShellvCenter 6.7 Shell 替换SSL证书全流程测试&验证 参考链接 系列文章回顾 第二章 FortiGate防火墙使用自建SSL证书 vCenter6.7使用自建SSL证书…

【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述 裁剪空间是一个顶点乘以MVP矩阵之后所在的空间&#xff0c;Vertex Shader的输出就是在裁剪空间上&#xff08;划重点&#xff09; NDC空间概述 接上面&#xff0c;由GPU自己做透视除法将顶点转到NDC空间 两者的转换 透视除法将Clip Space顶点的4个分量都除以…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

kafka如何保证消息不丢失 不重复消费 消息的顺序

如何保证消息的不丢失 消息为什么会丢失 想要保证消息不丢失就要首先知道消息为什么会丢失,在哪个环节会丢失,然后在丢失的环节做处理 1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息…

深度学习早停机制(Early Stopping)与早退机制(Early exiting)

早停机制&#xff0c;一种机器学习模型调优策略&#xff0c;提升调优效率 下图损失值明显经过了欠拟合到过拟合 使用早停机制后&#xff0c;模型不再过拟合 模型早停是面向模型训练过程的。而在模型内部&#xff0c;也会出现类似的现象&#xff0c;这一现象被叫做过度思考(Ove…

Android Studio 模拟器设置独立窗口

目录 模拟器在窗口内部运行 设置成独立窗口 模拟器在窗口内部运行 操作起来十分不便 设置成独立窗口 Android Studio -> Preferences(Settings) -> Tools-> Emulator ->取消勾选 Launch in a tool window -> 点击右下角的 OK 按钮 -> 重启 Android Studio

0 NLP: 数据获取与EDA

0数据准备与分析 二分类任务&#xff0c;正负样本共计6W&#xff1b; 数据集下载 https://github.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets/online_shopping_10_cats/online_shopping_10_cats.zip 样本的分布 正负样本中评论字段的长度 &#xff0c;超过500的都…