自己实现一个MyArrayList

自己实现一个MyArrayList
摘要由CSDN通过智能技术生成

首先,ArrayList的底层是一个数组,我们需要先来创建一个数组,并且使用usesSize记录他的元素个数。然后写出构造函数:

    public int[] elem;//null
    public int usedSize;//0

    public MyArrayList() {
        this.elem = new int[5];
    }

构造函数可以只进行数组的初始化,因为int型的对象默认初始化为0.

Add

在这里,我们进行Add的术后都是进行的尾插法。要注意的是,在add之前我们应该进行判断是否需要进行扩容;(这里的扩容就是动态类型的体现)。

扩容时:我们知道源码里的扩容是1.5倍扩容,我们为了书写简单直接进行二倍扩容。

    // 新增元素,默认在数组最后新增
    public void add(int data) {
        //1、判断是不是满的
        if(isFull()) {
            //扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

isFull

这个方法就是我们用来检查是否存储满的标志。

实现很简单,只需要检查usedSize是否和数组的长度相等即可。

    pu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C++实现一个MyArrayList,其中包含了常见的数组操作函数: ```c++ #include <iostream> #include <stdexcept> template <typename T> class MyArrayList { private: T *data; int size; int capacity; public: MyArrayList(int capacity = 10) { this->capacity = capacity; data = new T[capacity]; size = 0; } ~MyArrayList() { delete[] data; } int getSize() const { return size; } bool isEmpty() const { return size == 0; } void add(int index, T e) { if (index < 0 || index > size) throw std::invalid_argument("Add failed. Index is invalid."); if (size == capacity) resize(2 * capacity); for (int i = size - 1; i >= index; i--) data[i + 1] = data[i]; data[index] = e; size++; } void addLast(T e) { add(size, e); } void addFirst(T e) { add(0, e); } T get(int index) const { if (index < 0 || index >= size) throw std::invalid_argument("Get failed. Index is invalid."); return data[index]; } void set(int index, T e) { if (index < 0 || index >= size) throw std::invalid_argument("Set failed. Index is invalid."); data[index] = e; } bool contains(T e) const { for (int i = 0; i < size; i++) { if (data[i] == e) return true; } return false; } int find(T e) const { for (int i = 0; i < size; i++) { if (data[i] == e) return i; } return -1; } T remove(int index) { if (index < 0 || index >= size) throw std::invalid_argument("Remove failed. Index is invalid."); T ret = data[index]; for (int i = index + 1; i < size; i++) data[i - 1] = data[i]; size--; if (size == capacity / 4 && capacity / 2 != 0) resize(capacity / 2); return ret; } T removeFirst() { return remove(0); } T removeLast() { return remove(size - 1); } void removeElement(T e) { int index = find(e); if (index != -1) remove(index); } private: void resize(int newCapacity) { T *newData = new T[newCapacity]; for (int i = 0; i < size; i++) newData[i] = data[i]; delete[] data; data = newData; capacity = newCapacity; } }; int main() { MyArrayList<int> arr; for (int i = 0; i < 10; i++) arr.addLast(i); arr.add(1, 100); std::cout << arr.get(1) << std::endl; arr.remove(2); arr.removeElement(4); for (int i = 0; i < arr.getSize(); i++) std::cout << arr.get(i) << " "; std::cout << std::endl; return 0; } ``` 这个MyArrayList实现了动态扩展,可以在插入元素时自动扩容,也可以在删除元素时自动缩容。同时,还实现了常见的数组操作函数,例如在指定位置插入元素、在末尾添加元素、在头部添加元素、获取指定位置的元素、修改指定位置的元素、查找指定元素是否存在、查找指定元素的位置、删除指定位置的元素、删除第一个元素、删除最后一个元素、删除指定元素等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值