数据结构 模拟实现ArrayList顺序表

这篇具有很好参考价值的文章主要介绍了数据结构 模拟实现ArrayList顺序表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、顺序表中的接口

二、顺序表中的方法实现

(1)display方法

(2)add方法

1、不指定下标位置插入

2、指定下标位置插入

(3)contains方法

(4)indexOf方法

(5)get方法

(6)set方法

(7)remove方法

(8)size方法

(9)clear方法

三、最终代码


一、顺序表中的接口

代码如下:

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();
}

以上的方法就是我们要模拟实现顺序表的方法了。


二、顺序表中的方法实现

创建一个类,这个类实现上面接口,重写类里所有的方法。

我们知道,顺序表其实就是数组,所以要创建一个数组来存放数据,还要用一个整型变量来记录顺序表的大小,还有构造方法,我们可以指定顺序表的容量,也可以使用默认容量为10,代码如下

public class MyArrayList implements IList{
    public int[] elem;
    private int usedSize = 0;
    private int DEFAULT_SIZE = 10;

    public MyArrayList() {
        elem = new int[DEFAULT_SIZE];
    }
    public MyArrayList(int size) {
        elem = new int[size];
    }
}

(1)display方法

这个方法是打印顺序表的方法,并不是顺序表中的方法

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

(2)add方法

1、不指定下标位置插入

插入元素前要检查顺序表满没满,满了就要扩容,再插入元素,因为没指定下标插入元素,所以插入的是顺序表的末位置,也就是usedSize位置,插入完后usedSize要自增,表示顺序表多了一个元素,代码如下:

@Override
    public void add(int data) {
        //检查容量
        checkCapacity();
        //添加元素
        elem[usedSize] = data;
        usedSize++;
    }
    private void checkCapacity() {//检查容量
        if(ifFull()) {
            //扩容
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
    }
    private boolean ifFull() {//判断数组满了没
        return usedSize == elem.length;
    }

2、指定下标位置插入

指定下标位置插入元素就要判断这个下标是否合法,不合法就要抛出异常,下标是合法的就判断顺序表的容量满了没,没满就扩容,当经过上面两个检查后,才能指定位置插入元素,但插入前,还要把指定的下标,及之后的元素都往后移动一位,才能把要放的元素放进去,代码如下:

@Override
    public void add(int pos, int data) throws PosIllegality{
        //判断pos下标是否合法
        try {
            checkPosOnAdd(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        //数组满了就要扩容
        checkCapacity();
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }
    private void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos > usedSize) {
            //不合法,抛异常
            System.out.println("不合法");
            throw new PosIllegality("数组下标不合法" + pos);
        }
    }
//异常
public class PosIllegality extends RuntimeException{
    public PosIllegality(String msg) {
        super(msg);
    }
}

(3)contains方法

判定是否包含某个元素,代码如下:

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

(4)indexOf方法

查找某个元素对应的位置,代码如下:

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

(5)get方法

获取 pos 位置的元素,这个和add指定位置一样,要判断pos下标是否合法,不合法就要抛异常,当顺序表是空的时候,也要抛异常,当上面两个判断都没有抛异常后,就返回指定下标的元素,代码如下:

@Override
    public int get(int pos) {
        try {
            checkPosOnGetAndSet(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        if(usedSize == 0) {
            //数组为空,拿不了,抛异常
            throw new MyArrayListEmpty("顺序表为空");
        }
        return elem[pos];
    }
    private void checkPosOnGetAndSet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usedSize) {
            //下标不合法
            System.out.println("下标不合法");
            throw new PosIllegality("查找的下标不合法" + pos);
        }
    }

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

(6)set方法

给 pos 位置的元素设为 value,要检查下标是否合法,不合法就要抛异常,合法就给 pos 位置的元素设为 value,代码如下:

@Override
    public void set(int pos, int value) throws PosIllegality{
        try {
            //检查下标合法性
            checkPosOnGetAndSet(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        elem[pos] = value;
    }

(7)remove方法

删除第一次出现的关键字key,这个方法可以用上面的indexOf方法,找到key值的下标,有就返回下标数字,没有返回-1,当返回的是-1,就输出“没有这个数字”,有就删除这个下标元素,方法是后面元素往前覆盖,再把usedSize自减,表示顺序表少了一个元素,代码如下:

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

(8)size方法

获取顺序表长度,代码如下:

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

(9)clear方法

清空顺序表,代码如下

@Override
    public void clear() {
        usedSize = 0;
    }

三、最终代码

MyArrayList类:

public class MyArrayList implements IList{
    public int[] elem;
    private int usedSize = 0;
    private int DEFAULT_SIZE = 10;

    public MyArrayList() {
        elem = new int[DEFAULT_SIZE];
    }
    public MyArrayList(int size) {
        elem = new int[size];
    }
    @Override
    public void add(int data) {
        //检查容量
        checkCapacity();
        //添加元素
        elem[usedSize] = data;
        usedSize++;
    }
    private void checkCapacity() {//检查容量
        if(ifFull()) {
            //扩容
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
    }
    private boolean ifFull() {//判断数组满了没
        return usedSize == elem.length;
    }

    @Override
    public void add(int pos, int data) throws PosIllegality{
        //判断pos下标是否合法
        try {
            checkPosOnAdd(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        //数组满了就要扩容
        checkCapacity();
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }
    private void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos > usedSize) {
            //不合法,抛异常
            System.out.println("不合法");
            throw new PosIllegality("数组下标不合法" + pos);
        }
    }
    @Override
    public boolean contains(int toFind) {
        if(usedSize == 0) return false;
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

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

    @Override
    public int get(int pos) {
        try {
            checkPosOnGetAndSet(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        if(usedSize == 0) {
            //数组为空,拿不了,抛异常
            throw new MyArrayListEmpty("顺序表为空");
        }
        return elem[pos];
    }
    private void checkPosOnGetAndSet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usedSize) {
            //下标不合法
            System.out.println("下标不合法");
            throw new PosIllegality("查找的下标不合法" + pos);
        }
    }

    @Override
    public void set(int pos, int value) throws PosIllegality{
        try {
            //检查下标合法性
            checkPosOnGetAndSet(pos);
        } catch (PosIllegality e) {
            e.printStackTrace();
        }
        elem[pos] = value;
    }

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

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

    @Override
    public void clear() {
        usedSize = 0;
    }

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

//异常类文章来源地址https://www.toymoban.com/news/detail-760688.html

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

到了这里,关于数据结构 模拟实现ArrayList顺序表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构 之 顺序表 ArrayList (Java)

    🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!! 🌈个人主页: AUGENSTERN_dc 🔥个人专栏: C语言  |  Java | 数据结构 ⭐个

    2024年03月17日
    浏览(34)
  • 【数据结构】顺序队列模拟实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 一、队列的基本概念

    2024年02月10日
    浏览(40)
  • 【数据结构】顺序表与ArrayList

    作者主页: paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月08日
    浏览(42)
  • 【数据结构(二)】顺序表与ArrayList

    ❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力

    2024年04月12日
    浏览(38)
  • 数据结构:顺序表 模拟实现及详解

    目录 一、线性表 二、顺序表 2.1顺序表的概念及结构 2.1.1静态顺序表 2.2.2动态顺序表 2.2动态顺序表接口实现   线性表( linear list )是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串

    2024年01月22日
    浏览(40)
  • 【数据结构】从顺序表到ArrayList类

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,

    2024年01月24日
    浏览(46)
  • Collection与数据结构 顺序表与ArrayList

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,

    2024年04月13日
    浏览(42)
  • 【C语言数据结构】模拟·顺序表·总项目实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 我在上一篇博客中,

    2024年02月15日
    浏览(40)
  • 【Java】实现顺序表基本的操作(数据结构)

    在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构

    2024年02月03日
    浏览(48)
  • Java 中数据结构ArrayList的用法

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包