自定义实现简易版ArrayList

简介: 自定义实现简易版ArrayList

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;
    }
}
目录
相关文章
|
数据采集 存储 SQL
基于Apache doris的元数据管理系统
什么是元数据?元数据和数据的区别是什么?元数据有什么作用。
1559 0
基于Apache doris的元数据管理系统
|
开发框架 移动开发 小程序
uniapp实现上传文件功能
uniapp实现上传文件功能
1035 0
|
12月前
|
XML 小程序 前端开发
小程序制作教程
小程序制作教程
695 3
小程序制作教程
|
10月前
|
人工智能 自然语言处理 搜索推荐
智能语音助手的发展与未来:开启人机交互的新篇章
智能语音助手的发展与未来:开启人机交互的新篇章
1592 28
|
应用服务中间件 Linux 网络安全
nginx安装的详细教程(包括命令行安装和编译安装)
nginx安装的详细教程(包括命令行安装和编译安装)
|
前端开发 JavaScript 开发工具
【React】使用Next.js构建并部署个人博客
【React】使用Next.js构建并部署个人博客
【React】使用Next.js构建并部署个人博客
|
Kubernetes Ubuntu 搜索推荐
containerd配置HTTP私仓
在240个字符内,以下是摘要: 在Ubuntu 22.04上,配置K8S基础环境后,安装Docker并设置镜像加速,接着部署私有的Harbor仓库(HTTP访问)。要将镜像推送到Harbor,需编辑Docker的`daemon.json`加入不安全注册表,然后重启服务。通过`docker login`、`docker tag`和`docker push`推送到Harbor。此外,配置`containerd`以信任Harbor的HTTP地址,更新`/etc/containerd/certs.d/`,重启服务后,使用`ctr`拉取和推送镜像至Harbor。
containerd配置HTTP私仓
|
机器学习/深度学习 数据采集 人工智能
数据科学实训案例研发:农业遥感图像数据分析上线阿里云
这是2020年阿里云计算有限公司-教育部产学合作协同育人项目的成果。 实训课程内容涵盖了主要内容涵盖了图像分割的基础知识,主要包括图像分割的概论、基础、分类、神经网络实现等经典的机器学习理论知识,也包括卷积神经网络、残差网络、U-Net算法、多模态等深度学习内容。此外,还介绍天池AI等平台的应用,在此基础上通过实验的方式,详细地介绍机器视觉在农业大数据分析领域的过程,以及遥感图像处理相关技术的原理与实践。结合阿里云的产品和技术资源,进行应用实验,让学生在充分理解掌握基础知识的同时,也能接触到业界最前沿的发展方向和成果。本课程通过实验大作业的方式,实现典型的机器视觉应用,训练学生模型设计与应用。
709 0
|
JSON Java 数据格式
SpringBoot下thymeleaf使用UEditor
以前传统web工程下使用UEditor是继承ActionEnter实现自己的MyActionEnter来实现自定义文件上传路径的
155 0