数据结构基础之动态数组

2023-05-16

目录

前言

1、Java中的数组

2、实现动态数组

2.1、基本类结构设计

2.2、添加元素

2.3、查询&修改元素

2.4、包含&搜索&删除

2.5、数组扩容


前言

今天我们来学习一下关于数据结构的一些基础知识,数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以更高效的获取数据或者修改数据,那么首先我们要说的就是数组。

1、Java中的数组

数组就是把数据放成一排进行存放

通过一段代码来回忆一下数组的具体使用吧:

数组最大的优点就是:快速查询(比如ages[2])。

思考:数组的大小在创建的时候就已经固定了,那么如果我们往数组里添加的元素个数超过了数组的最大容量时,该怎么办呢?

2、实现动态数组

基于上面的思考,我们就来基于Java为我们提供的数组,一步一步的实现一个动态数组,可以满足增删改查的需求,并且当元素个数超过数组容量时,可以自动扩容。

2.1、基本类结构设计

public class Array {
    private int[] data;
    private int size;

    /**
     * 构造函数,传入的是数组的容量
     *
     * @param capacity 容量
     */
    public Array(int capacity) {
        data = new int[capacity];
        size = 0;
    }

    // 无参构造,默认容量为10
    public Array() {
        this(10);
    }

    // 获取数组中的元素个数
    public int getSize() {
        return size;
    }

    // 获取数组的容量
    public int getCapacity() {
        return data.length;
    }

    //判断数组是否为空
    public boolean isEmpty() {
        return size == 0;
    }
}

2.2、添加元素

思想:向数组末尾添加元素

2.3、查询&修改元素

2.4、包含&搜索&删除

经过上面这些步骤,数组中的相关方法都已经添加好了,最后我们再把这个Array类修改为泛型类Array<Element>,让它可以添加各种数据类型的元素,这里我就不再一一修改了,后面会附上完整的代码。

接下来我们来简单测试一下我们的Array类是否可用:

执行结果如下:

2.5、数组扩容

对于扩容也很简单,就是当数组中的容量不够存储时,重新创建一个更大容量的数组,然后将原数组的数据一一更新到新数组中,当然,具体扩容成多少就由开发者自行决定了,下面来看代码:

然后我们来实际测试一下是否扩容成功:

从执行的结果中可以很明显的看出,我们的动态数组已经成功实现了扩容:

最后附上完整的Array.java类的源码吧:

public class Array<E> {
    private E[] data;
    private int size;

    /**
     * 构造函数,传入的是数组的容量
     *
     * @param capacity 容量
     */
    public Array(int capacity) {
        data = (E[]) new Object[capacity];
        size = 0;
    }

    // 无参构造,默认容量为10
    public Array() {
        this(10);
    }

    // 获取数组中的元素个数
    public int getSize() {
        return size;
    }

    // 获取数组的容量
    public int getCapacity() {
        return data.length;
    }

    //判断数组是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    // 向所有元素后添加一个新元素
    public void addLast(E e) {
        add(size, e);
    }

    // 向所有元素前添加一个新元素
    public void addFirst(E e) {
        add(0, e);
    }

    // 向第index位置插入一个新元素
    public void add(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("数组下标异常");
        }
        if (size == data.length) {
            resize(2 * data.length);
        }
        for (int i = size - 1; i >= index; i--) {
            data[i + 1] = data[i];
        }
        data[index] = e;
        size++;
    }

    // 容量不够时进行扩容
    private void resize(int newCapacity) {
        E[] newdata = (E[]) new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newdata[i] = data[i];
        }
        data = newdata;
    }

    // 获取index索引位置的元素
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("数组下标异常");
        }
        return data[index];
    }

    //修改index索引位置的元素
    public void set(int index, E e) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("数组下标异常");
        }
        data[index] = e;
    }

    // 查找数组中是否有元素e
    public boolean contains(E e) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)) {
                return true;
            }
        }
        return false;
    }

    // 查找数组中元素e所在的索引,如果没有则返回-1
    public int findIndex(E e) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)) {
                return i;
            }
        }
        return -1;
    }

    // 从数组中删除index位置的元素,并且返回删除的元素
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("数组下标异常");
        }
        E ret = data[index];
        for (int i = index + 1; i < size; i++) {
            data[i - 1] = data[i];
        }
        size--;
        if (size == data.length / 4 && data.length / 2 != 0) {
            resize(data.length / 2);
        }
        return ret;
    }

    // 从数组中删除第一个元素
    public E removeFirst() {
        return remove(0);
    }

    // 从数组中删除最后一个元素
    public E removeLast() {
        return remove(size - 1);
    }

    // 从数组中删除元素e
    public void removeElement(E e) {
        int index = findIndex(e);
        if (index != -1) {
            remove(index);
        }
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array:size=%d,capacity=%d\n", size, data.length))
                .append("[");
        for (int i = 0; i < size; i++) {
            res.append(data[i]);
            if (i != size - 1) {
                res.append(",");
            }
        }
        res.append("]");
        return res.toString();
    }
}

 OK,关于动态数组的相关内容就说这么多吧,下期再会!

祝:工作顺利!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构基础之动态数组 的相关文章

  • C#中如何实现C++中的const reference

    C 中如何实现C 43 43 中的const reference 在读C in depth时 xff0c 作者曾经感慨过 xff0c 可惜C 中没有类似于C 43 43 的const机制 xff0c 没有办法方便的返回一个对象的只读视图 读
  • VC环境下创建生成EXE的symbian工程问题集

    问 xff1a 1 我在VC下都是生成APP文件 xff0c 那么有没办法生成EXE呢 xff1f 如果不能直接在VC里生成 xff0c 那有其它的什么办法吗 xff1f 答 xff1a 1 生成什么类型的目标文件跟使用的IDE无关 xff
  • 图像处理中常见的滤波器小结

    在图像处理 计算机视觉领域 xff0c 我们有时需要对原始图像进行预处理 图像滤波是一种比较常用的方法 xff0c 通过滤波操作 xff0c 就可以突出一些特征或者去除图像中不需要的成分 通过选取不同的滤波器 xff0c 在原始图像上进行滑
  • CentOS7关闭默认firewall启用iptables防火墙

    CentOS7关闭默认firewall启用iptables防火墙 CentOS7关闭firewall启用iptables防火墙 CentOS 7系统默认的防火墙是firewall xff0c 但是我们很多人还是习惯使用iptables xf
  • Supervisor的安装与使用

    简介 Supervisor 是用 Python 开发的一套通用的 进程管理程序 xff0c 能将一个普通的命令行进程变为后台daemon xff0c 并监控进程状态 xff0c 异常退出时能自动重启 它是通过fork exec的方式把这些被
  • devenv使用方法

    CD C CD C Program Files Microsoft Visual Studio NET 2003 Common7 IDE DEL D KTAPP KTUI1601 licx devenv build debug 34 D K
  • usb连接ubuntu,fdisk -l 查不出usb信息

    问题 xff1a 想要通过usb连接在虚拟机上的Ubuntu xff0c 但连接上后linux系统有图标但是却是灰色的 xff0c 在虚拟机 可移动设备 xff0c 那里的USB 断开与主机连接也是灰色 通过fdisk l 查不到usb信息
  • 树莓派——开启xrdp,换镜像,双击打开sh等等__一蓑烟雨任平生

    文章目录 前言一 树莓派是什么 xff1f 二 烧卡开机1 镜像用树莓派官网的镜像2 开机基本设置3 设置SSH和VNC4 查看本地IP5 设定固定IP 二 深度设置1 更换镜像源2 安装远程桌面3 修改sh脚本 Linux基本命令使用总结
  • 关于QImage无法设置透明色的问题

    明明在setPixelColor时 xff0c 设置的QColor为 xff08 254 254 254 0 xff09 xff0c 但是最后的结果却是白色 这是由于在设置QImage格式时 xff0c 该格式不支持透明色 xff0c 可以
  • 程序员必备的 40 个 VSCode 扩展

    在编写代码时 xff0c 一个富有成效的工作空间不仅仅是要找到合适的代码编辑器 开箱即用的VS Code是为开发人员制作的 根据2021年StackOverflow的调查 xff0c 71 06 的受访者将Visual Studio Cod
  • django debug toolbar 不显示

    python3 6 43 django2 0 xff0c 安装了django debug toolbar xff0c 根据官方文档配置之后却没看到调试栏 xff0c 增加了SHOW TOOLBAR CALLBACK字段后才显示 settin
  • 驳 GarbageMan 的《一个超复杂的简介递归》——对延迟计算的实验和思考

    这是一篇因骂战而起的博文 xff0c GarbageMan 在该文章回复中不仅对我进行了侮辱 xff0c 还涉及了我的母校 xff0c 特写此文用理性的分析和实验予以回击 在此也劝告 GarbageMan xff0c 没什么本事就别在那叫嚣
  • Debian_DNS服务搭建

    DNS是什么 xff1f DNS xff0c Domain Name System或者Domain Name Service xff08 域名系统或者余名服务 xff09 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域
  • 解决MySQL无法插入中文数据问题(UTF-8编码)

    我花了好几个小时找过各种方法 xff0c 最终靠这个方法实现了中文插入 xff0c 我都快要喜极而泣了 xff0c 分享给大家 xff0c 真的很实用 一些关于查看和修改字符集的MySQL知识 xff1a 查看mysql的字符集 xff1a
  • PHP判断IP是否属于某个网段

    IP通过ip2long转换后可以进行比较 span class php span class hljs preprocessor lt php span span class hljs comment 判断IP是否在某个网络内 span c
  • phpstore 2016.1版激活方法

    激活请填写下面的地址吧 xff1a span class hljs label http span idea span class hljs preprocessor qinxi span 1992 span class hljs prep
  • Group by无法排序,但可以通过子查询实现

    lt pre name 61 34 code 34 class 61 34 sql 34 gt select from table where id in select max id from table where tid in 0 10
  • ext4文件系统恢复被删除的文件

    ext4magic工具 可以恢复出被rm f删除的文件 xff08 只要原始数据块未被新数据所覆盖 xff09 ext4magic device M d savedir 可参考 https sourceforge net projects
  • nginx反向代理经验整理

    location flag proxy pass http 127 0 0 1 19999 上面这段配置的反向代理实际访问路径是 usr www location flag proxy pass http 127 0 0 1 19999 上
  • Git一些使用注意事项

    Git创建远程空仓库时要注意加上 shared 61 group 即命令 xff1a 初始化远程空仓库 xff1a git init bare shared 61 group 给空仓库设置组共享 xff1a git config core

随机推荐

  • 使用WSL在Windows上安装Ubuntu

    1 清理环境 查看当前的wsl 状态 xff0c wsl list 可以列出当前系统中已安装的子系统 选择需要清理的系统 xff0c 然后用 wsl unregister lt DistributionName gt 即可完成卸载 将 ws
  • CentOS/Ubuntu/Debian常用版本更换国内源的方法

    Linux系统安装完后软件源一般都是国外服务器 xff0c 在国内特别慢 xff0c 这时候就需要更换国内的镜像源 如163 aliyun 还有各高校镜像源等 记住先备份原始源在更换源 xff0c 以防以后备用 一 centos 1 备份
  • C++ 的引用类型

    C 43 43 的引用类型 在翻旧文的时候 xff0c 发现这么一篇文章 xff1a 关于一道C 43 43 笔试题的纠结 xff0c 学计算机的伤不起啊 当时可能是觉得 Placement new 的语法1比较新鲜 xff0c 所以印象比
  • Debian 10(buster) 更换国内软件源

    今天安装了个debian10 xff0c 发现网上包括各大镜像网站提供的源地址都有点问题 xff0c 经测试 xff0c Debian 10 xff08 buster xff09 可用的国内软件源如下 xff08 阿里云源 xff09 xf
  • 华为交换机SNMP配置

    华为交换机SNMP配置 snmp服务配置 交换机内设置snmp一般只需要启动snmp服务和配置团体名称 xff0c 然后设置下版本就可以了 全局模式下 xff0c 配置命令 1 启动snmp服务 xff1a snmp agent 2 设置团
  • qt 菜单栏创建

    h文件内容 xff1a pragma once include lt QtWidgets QMainWindow gt include 34 ui QtWidgetsApplication2 h 34 include lt QLabel g
  • 立志学习编程的第一天 2021-05-06

    一直很遗憾大学没能报计算机专业 xff08 还一直觉得自己是被耽误的程序员来着 xff09 现在且用业余时间来试试 xff0c 且拭目以待吧 xff01 学习内容 xff1a Clojure for the Brave and True 工
  • 关于Clojure的Emacs配置 2021-05-07

    首先安装lein和Emacs xff1a https leiningen org http www gnu org software emacs 安装好Emacs之后 xff0c 找到 emacs d 对windows系统 xff0c 文件
  • Clojure基础语法学习笔记(一)

    首先推荐两个目前正在学的免费学习资源 xff1a Functional programming in Clojure Clojure for the Brave and True 都是英文的 xff0c 第一个是边学边练的形式 xff0c
  • matlab interp2函数详解

    切入正题 xff1a 下面是一个测试INTERP2 xff08 xff09 函数的MATLAB代码 function INTERP2 TEST I 61 2 3 6 8 3 5 1 7 4 2 9 6 6 8 1 3 X Y 61 mesh
  • word2016转mathtype

    用word2016自带公式编辑器给师兄敲了一堆公式之后 xff0c 发现毕业论文要求用mathtype 官网给的解决措施是 xff1a 1 http www mathtype cn wenti wordgongshi zhuanhuan h
  • 虚拟机中Linux扩容硬盘空间

    在初始安装CentOS时 xff0c 只给了硬盘空间30GB xff0c 现在因为需要 xff0c 所以需要扩容 1 关闭虚拟机中的系统 xff0c 打开虚拟机的设置 xff0c 修改磁盘空间到合适的大小 xff0c 再重启系统 2 打开终
  • Vue3 - setup语法糖

    与setup函数不同的是 xff0c 在script标签中添加setup 1 变量 方法不需要 return 出来 属性和方法也不用返回 xff0c 也不用写setup函数 xff0c 也不用写export default xff0c 甚至
  • Autoware 安装(源码)过程 与 踩坑记录(Ubuntu18.04)

    目录 autoware 源码安装 安装 ROS Melodic xff1a 设置软件源 设置密钥 xff1a 安装ROS xff1a rosdep xff1a 安装rosinstall 添加ROS环境变量 配置ROS环境变量 创建工作目录
  • 读论文:Feedback Network for Image Super-Resolution

    源码 xff1a https github com Paper99 SRFBN CVPR19 1 介绍 xff08 1 xff09 基于深度学习的方法的优势主要来自其两个关键因素 xff1a 深度和跳跃链接 第一 xff0c 保留更多的上下
  • Kolla-ansible部署OpenStack Train实践

    Kolla ansible部署OpenStack Train实践 前言系统环境设置安装pip和docker安装ansible安装kolla ansible配置文件修改执行部署 登录openstack写在最后部署过程中遇到的问题总结 前言 最
  • Windows 7 如何升级 PowerShell

    操作环境 xff1a Windows 7 旗舰版 Service Pack 1 x64 PowerShell 2 0 gt PowerShell 4 0 解决过程 xff1a 1 下载Windows6 1 KB2819745 x64 Mul
  • 最简单的算法:线性查找法

    目录 写在前面 一 什么是算法 二 线性查找法 2 1 实现线性查找法 2 2 思维拓展 使用泛型 2 3 自定义类测试泛型方法 2 4 循环不变量 三 复杂度分析 3 1 复杂度分析简介 3 2 常见的算法复杂度 四 算法性能测试 写在前
  • Android仿抖音主页效果实现

    目录 写在前面 一 准备工作 1 1 主页面布局 1 2 列表Item布局 1 3 列表Item适配器 二 自定义LayoutManager 三 实现播放 补充 xff1a 源码地址 xff1a https github com JArch
  • 数据结构基础之动态数组

    目录 前言 1 Java中的数组 2 实现动态数组 2 1 基本类结构设计 2 2 添加元素 2 3 查询 amp 修改元素 2 4 包含 amp 搜索 amp 删除 2 5 数组扩容 前言 今天我们来学习一下关于数据结构的一些基础知识 x