自定义实现简易版ArrayList

news2024/10/7 4:29:33

文章目录

  • 1.了解什么是顺序表
  • 2.实现哪些功能
  • 3.初始化ArrayList
  • 4.实现功能接口
    • 遍历顺序表
    • 判断顺序表是否已满
    • 添加元素
    • 指定下标添加元素
    • 自定义下标不合法异常
    • 判断顺序表是否为空
    • 查找指定元素是否存在
    • 查找指定元素返回下标
    • 获取指定下标的元素
    • 顺序表为空异常
    • 修改指定下标元素的值
    • 删除指定元素
    • 顺序表长度
    • 回收顺序表
  • 完整代码

1.了解什么是顺序表

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

2.实现哪些功能

对于一个顺序表来说
我们做的最多的也就是增删查改
则实现以下接口:

public interface IList {

    //新增元素,默认在数组最后新增
    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();
	//判断是否已满
    boolean isFull();
	//判断是否为空
    public boolean isEmpty();
}

3.初始化ArrayList

usedSize为使用的长度
DEFAULT_SIZE = 10为默认顺序表的容量
两个构造方法
无参构造:顺序表默认大小为10;
有参构造:自定义顺序表大小;

public class MyList implements IList{
    public int[] elem ;
    
    public int usedSize;//0
    //顺序表的 默认大小
    public static final int DEFAULT_SIZE = 10;
    public MyList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyList(int capacity){
        this.elem = new int[capacity];
    }
 }

4.实现功能接口

遍历顺序表

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

判断顺序表是否已满

public boolean isFull(){

        return usedSize == elem.length;
     }

添加元素

checkCapacity()判断顺序表是否已满,如果已经满了则进行扩容
扩容为原来顺序表的两倍

 private void checkCapacity(){
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }
    public void add(int data){
        checkCapacity();
        elem[this.usedSize] = data;
        this.usedSize++;
    }

指定下标添加元素

checkPosOnAdd()判断下标是否合法,如果不合法抛出异常

public void checkPosOnAdd(int pos) throws PosIllegality{

        if(pos < 0 || pos >usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public void add(int pos, int data){
        try{
            checkPosOnAdd(pos);
        }
        catch (PosIllegality e){
            e.printStackTrace();
            return;
        }
        checkCapacity();
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];

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

自定义下标不合法异常

package mylist;


public class PosIllegality extends RuntimeException{
    public PosIllegality(String msg){
        super(msg);
    }
}

判断顺序表是否为空

public boolean isEmpty(){

        return usedSize == 0;
    }

查找指定元素是否存在

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

查找指定元素返回下标

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

获取指定下标的元素

public void checkPosOnGetAndSet(int pos) throws PosIllegality {
        if(pos < 0 || pos >= usedSize){
            System.out.println("不合法");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }

    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()){

                throw new MyArrayListEmpty("获取指定下标元素时" +
                        "顺序表为空!");
        }
            return elem[pos];

    }

顺序表为空异常

package mylist;


public class MyArrayListEmpty extends RuntimeException{
    public MyArrayListEmpty(String msg){
        super(msg);
    }
}

修改指定下标元素的值

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

删除指定元素

  public void remove(int toRemove){
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("没有找到");
            return;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] =elem[i+1];
        }
        usedSize--;
    }

顺序表长度

  public int size(){
        return this.usedSize;
    }

回收顺序表

 public void clear() {
        usedSize = 0;
    }

完整代码

在这里插入图片描述

package mylist;

import java.util.Arrays;


public class MyList implements IList{
    public int[] elem ;
    public int usedSize;//0
    //顺序表的 默认大小
    public static final int DEFAULT_SIZE = 10;
    public MyList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyList(int capacity){
        this.elem = new int[capacity];
    }
    public void display(){
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }
     public boolean isFull(){

        return usedSize == elem.length;
     }
    private void checkCapacity(){
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }
    public void add(int data){
        checkCapacity();
        elem[this.usedSize] = data;
        this.usedSize++;
    }

    public void checkPosOnAdd(int pos) throws PosIllegality{

        if(pos < 0 || pos >usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }
    public void add(int pos, int data){
        try{
            checkPosOnAdd(pos);
        }
        catch (PosIllegality e){
            e.printStackTrace();
            return;
        }
        checkCapacity();
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];

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

    }
    public boolean isEmpty(){

        return usedSize == 0;
    }
    public boolean contains(int toFind){
        if(isEmpty()){
            return false;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    public int indexOf(int toFind){
        if(isEmpty()){
            return -1;
        }
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }

    public void checkPosOnGetAndSet(int pos) throws PosIllegality {
        if(pos < 0 || pos >= usedSize){
            System.out.println("不合法");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }

    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()){

                throw new MyArrayListEmpty("获取指定下标元素时" +
                        "顺序表为空!");
        }
            return elem[pos];

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

    public void remove(int toRemove){
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("没有找到");
            return;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] =elem[i+1];
        }
        usedSize--;
    }
    public int size(){
        return this.usedSize;
    }
    public void clear() {
        usedSize = 0;
    }
}

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

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

相关文章

【深度学习实验】线性模型(三):使用Pytorch实现简单线性模型:搭建、构造损失函数、计算损失值

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义线性模型linear_model 2. 定义损失函数loss_function 3. 定义数据 4. 调用模型 5. 完整代码 一、实验介绍 使用Pytorch实现 线性模型搭建构造损失函数计算损失值 二、…

5-1 Dataset和DataLoader

Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。 Dataset定义了数据集的内容&#xff0c;它相当于一个类似列表的数据结构&#xff0c;具有确定的长度&#xff0c;能够用索引获取数据集中的元素。 而DataLoader定义了按batch加载数据集的方法&#xff0c;它是…

无涯教程-JavaScript - EVEN函数

描述 EVEN函数返回四舍五入到最接近的偶数整数的数字。您可以使用此功能来处理两个项目。 语法 EVEN (number)争论 Argument描述Required/OptionalNumberThe value to round.Required Notes 如果数字为非数字,则EVEN返回#VALUE!错误值。 不管数字的符号如何,当从零开始调…

VisualStudio配置驱动远程部署

目标机器开启ping命令 默认情况下&#xff0c;Windows出于安全考虑不允许外部主机对其进行Ping测试。 允许ICMP回显 设置如下&#xff1a; 打开win7防火墙设置界面 左边的菜单中选择 【高级设置】 在弹出的 【高级安全 Windows 防火墙】 界面&#xff0c;选择 【入站规则】 …

Java常见面试题(含答案,持续更新中~~)

目录 1、JVM、JRE和JDK的关系 2、什么是字节码&#xff1f;采用字节码的最大好处是什么 3、Java和C的区别与联系 4、Java和GO的区别与联系 5、 和 equals 的区别是什么&#xff1f; 6、Oracle JDK 和 OpenJDK 的对比 7、String 属于基础的数据类型吗&#xff1f; 8、fi…

VHOST-SCSI代码分析(3)数据流处理

VHOST SCSI数据流如下所示&#xff1a; IO下发过程 虚拟机中应用态程序下发IO&#xff0c;依次经过VFS/文件系统层&#xff0c;BLOCK层&#xff0c;SCSI层&#xff0c;经VIRTIO SCSI驱动virtscsi_commit_rqs访问寄存器通知HOST内核中VHOST设备&#xff08;VHOST KICK过程&#…

tolua源码分析(十一)代码生成

tolua源码分析&#xff08;十一&#xff09;代码生成 上一节我们分析了tolua中struct数据在lua和C#之间传递的过程&#xff0c;这一节我们来看一下tolua自动生成各种辅助代码的流程。 生成所有代码的入口位于ToLuaMenu.cs的GenLuaAll&#xff1a; [MenuItem("Lua/Genera…

达梦数据库-DW-国产化--九五小庞

武汉达梦数据库股份有限公司成立于2000年&#xff0c;是国内领先的数据库产品开发服务商&#xff0c;国内数据库基础软件产业发展的关键推动者。公司为客户提供各类数据库软件及集群软件、云计算与大数据等一系列数据库产品及相关技术服务&#xff0c;致力于成为国际顶尖的全栈…

读取yaml文件的值

记录一下&#xff0c;读取yaml文件中属性的值&#xff0c;这里用Kubernetes的deployment.yaml文件来举例。 读取yaml文件中的image的值 yaml文件 apiVersion: apps/v1 # 1.9.0 之前的版本使用 apps/v1beta2&#xff0c;可通过命令 kubectl api-versions 查看 kind: Deploy…

获取中文词组的汉语拼音首字母拼接

我们需要一个快捷批量处理&#xff1a;中文词组获取其汉语拼音首字母并拼接起来。 比如&#xff1a; 输出功率3&#xff1a;SCGL3 一鸣惊人&#xff1a;YMJR 我们可以采用字符字典法&#xff0c;穷举出所有的汉字【暂只考虑简体中文】 Dictionary<char,string> dict…

【数据分享】2006-2021年我国省份级别的市容环境卫生相关指标(20多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

文章目录 1. unordered_map的介绍2. unordered_map的使用2.1unordered_map的构造函数2.2unordered_map的迭代器2.3unordered_map的容量和访问函数2.4unordered_map的增删查改函数 1. unordered_map的介绍 unordered_map的介绍 &#xff08;1&#xff09;unordered_map是存储&l…

ElasticSearch(ES)简答了解

ES简介 Elasticsearch&#xff08;通常简称为ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;旨在处理各种类型的数据&#xff0c;包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的&#xff0c;但随着时间的推移&#xff0c;它已经演变成一个功能…

web系统安全设计原则

一、前言 近日&#xff0c;针对西工大网络被攻击&#xff0c;国家计算机病毒应急处理中心和360公司对一款名为“二次约会”的间谍软件进行了技术分析。分析报告显示&#xff0c;该软件是美国国家安全局&#xff08;NSA&#xff09;开发的网络间谍武器。当下&#xff0c;我们发现…

【骑行之旅】昆明草海湿地公园和海晏村的美丽邂逅

这是一个九月的星期六&#xff0c;在昆明的大观公园门口&#xff0c;我们集合了一群热爱骑行的骑友。今天&#xff0c;阳光明媚&#xff0c;天空湛蓝&#xff0c;一切都充满了活力。我们的旅程从这里开始&#xff0c;一路向西&#xff0c;向着下一站&#xff0c;美丽的草海湿地…

虚拟机用户切换及设置root权限的密码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

驱动开发,IO多路复用(select,poll,epoll三种实现方式的比较)

1.IO多路复用介绍 在使用单进程或单线程情况下&#xff0c;同时处理多个输入输出请求&#xff0c;需要用到IO多路复用&#xff1b;IO多路复用有select/poll/epoll三种实现方式&#xff1b;由于不需要创建新的进程和线程&#xff0c;减少了系统资源的开销&#xff0c;减少了上下…

从0到1搭建Halo博客系统教程

前期准备 云服务器&#xff0c;域名&#xff0c;命令工具&#xff08;这里使用是Mobaxterm&#xff09; 安装环境 宝塔面板 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec在命令工…

【计算机视觉】Image Generation Models算法介绍合集

文章目录 一、Diffusion二、Guided Language to Image Diffusion for Generation and Editing&#xff08;GLIDE&#xff09;三、classifier-guidance四、Blended Diffusion五、DALLE 2六、AltDiffusion七、Group Decreasing Network八、Make-A-Scene九、Iterative Inpainting十…

c++ - 抽象类 和 使用多态当中一些注意事项

抽象类 纯虚函数 在虚函数的后面写上 0 &#xff0c;则这个函数为纯虚函数。 class A { public:virtual void func() 0; }; 纯虚函数不需要写函数的定义&#xff0c;他有类似声明一样的结构。 抽象类概念 我们把具有纯虚函数的类&#xff0c;叫做抽象类。 所谓抽象就是&a…