动态数组的基本实现(增 删 改 查)

目录

一,动态数组

1.数组属性:

2.数组的增删改查(CRUD)

2.1表头,表尾和表中插入元素:

2.2.改数组中的某个元素:

2.3.查找数组中的某个元素:

2.4数组元素的删除

3.数组的扩容:

6.数组的序列化:

4.数组的大小


一,动态数组

1.数组属性:

1.1生成一个动态数组并设置大小:

//定义属性
    //elementData就是具体存储元素的数组
    private int[] elementData;
    //当前动态数组中存储了几个元素
    private int size;
    public DynamicArray(){
        this.elementData = new int[10];
    }

2.数组的增删改查(CRUD)

2.1表头,表尾和表中插入元素:

(1)表头插入:将数组中的每个元素向后移一位,将表头位置空出再插入。

(2)表尾插入:只需在表尾插入即可。

(3)表中插入:将要插入索引的元素到最后一个元素都向后移一位,空出要插入索引位置再插入。

注意:上述插入方式都要判断该数组空间是否够用,若不够用则需要扩容。

/**
     * 在数组头部添加元素
     * @param data
     */
    public void addFirst(int data){
        //此时内部小数组已满,需要扩容
        if (size == elementData.length){
            grow();
        }
        for (int i = size - 1; i >= 0; i--) {
            elementData[i + 1] = elementData[i];
        }
        //此时index = 0;数组头部空出来
        elementData[0] = data;
        size++;
    }

    /**
     *在数组的尾部添加元素
     * @param data
     */
    public void addLast(int data){
        if (size == elementData.length){
            grow();
        }
        elementData[size] = data;
        size++;
    }

    /**
     * 在数组的索引处添加元素
     * @param index
     * @param data
     */
    public void addIndex(int index,int data){
        //index在插入时,特殊场景
        //index=0 ,是头插
        //index = size, 是尾插
        //先判断边界条件index是否合法
        if (index < 0 || index > size){
            System.out.println("index非法,无法进行插入");
            return;
        }
        //判断当前数组是否已满
        if (size == elementData.length){
            grow();
        }
        //数据插入
        if (index == 0){
            addFirst(data);
        }
        if (index == size){
            addLast(data);
        }else {
            //在数组的中间位置插入
            for (int i = size - 1; i >= index; i--) {
                elementData[i + 1] = elementData[i];
            }
            //此时index位置空出
            elementData[index] = data;
            size++;
        }

2.2.改数组中的某个元素:

/**
     * 将指定位置index的元素修改为新值newData
     * @param index
     * @param newData
     * @return修改前的元素
     */
    public int set(int index,int newData){
         if (rangeCheck(index)){
             int oldValue = elementData[index];
             elementData[index] = newData;
             return oldValue;
         }
         return -1;
    }

    /**
     * 校验当前传入的index是否合法
     * @param index
     * @return
     */
    private boolean rangeCheck(int index){
        if (index < 0 || index > size){
         //错误输出
            System.err.println("当前index非法,index >= 0 && index < size");
            return false;
        }
        return true;
    }

2.3.查找数组中的某个元素:

**
     * 查找数组中是否含有某个元素
     * @param data
     * @return
     */
    public boolean contains(int data){
        for (int i = 0; i < size; i++) {
            if (elementData[i] == data){
                return true;
            }
        }
        return false;
    }

2.4数组元素的删除


    /**
     * 按索引删除
     * @param index
     */
    public void remove(int index){
        if (rangeCheck(index)){
            //从index位置开始,将之后的元素统一向前移一位
            for (int i = index; i < size; i++) {
                elementData[i] = elementData[i -1];
            }
            size--;
        }
    }

    /**
     * 按值删除
     * @param value
     */
    public void removeValue(int value){
        for (int i = 0; i < s; i++) {
            if (elementData[i] == value){
                remove(i);
            }
        }
    }

3.数组的扩容:

//内部扩容法
    private void grow(){
       int oldLength = elementData.length;
       int newLength = oldLength << 1;
       //将原数组搬移到新数组
       elementData = Arrays.copyOf(elementData,newLength);
    }

6.数组的序列化:

 /**
     * 将当前动态数组转换为字符串
     * @return
     */
    public String toString(){
        //每个元素都在elementData数组中存储
        String ret = "[";
        for (int i = 0; i < size; i++) {
             ret += elementData[i];
             if (i != size - 1){
                 ret += ",";
             }
        }
        ret += "]";
        return ret;
    }

4.数组的大小

//取得当前数组长度
    public int getSize(){
        return size;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值