动态数组实现

这篇博客详细介绍了如何使用Java实现动态数组,包括初始化、添加元素(头尾添加)、删除元素(按索引和值删除)以及数组扩容等功能。动态数组在实际存储中使用int[]数组,并通过size属性记录有效元素数量。示例代码展示了动态数组的常见操作,如添加、删除和打印数组内容。
摘要由CSDN通过智能技术生成
import java.util.Arrays;

// 动态数组
public class DynamicArrayReview {
    // 实际元素还是在int[]数组中存储
    private int[] elementData;
    // size干嘛的?size实际上描述了当前动态数组中实际存储的有效元素个数
    private int size;

    public DynamicArrayReview() {
        this.elementData = new int[10];
    }

    public DynamicArrayReview(int size) {
        this.elementData = new int[size];
    }

    public int getSize() {
        return size;
    }

    public void addIndex(int index,int data) {
        // index = 0 -> 在数组的头部添加
        // index = size -> 在数组的尾部添加
        if (index < 0 || index > size) {
            System.err.println("add index illegal!");
            return;
        }
        // 判断此时数组是否已满
        if (size == elementData.length) {
            // 扩容
            grow();
        }
        for (int i = size - 1;i >= index;i--) {
            // 数据搬移
            elementData[i + 1] = elementData[i];
        }
        // index位置的元素已经空出来了,直接插入新元素
        elementData[index] = data;
        size ++;
    }

    public void addFirst(int data) {
        addIndex(0,data);
    }

    public void addLast(int data) {
        addIndex(size,data);
    }

    public void removeIndex(int index) {
        // 先判断临界条件
        if (index < 0 || index >= size) {
            System.err.println("remove index illegal!");
            return;
        }
        // 此时index是合法滴
        for (int i = index + 1;i < size - 1;i ++) {
            // 将后一个元素覆盖前一个元素
            elementData[i] = elementData[i + 1];
        }
        size --;
        // 确保数组中最后元素也还原为默认值
        elementData[size] = 0;
    }

    /**
     * 按照值删除元素
     * @param value
     */

    public void removeValue(int value) {
        for (int i = 0; i < size; i++) {
            // 此时索引i对应的元素就是待删除的元素
            // [2,2,1,2,3,2] => value = 2
            // 由于此处可能会出现多个连续的待删除元素
            // 如果此时数组[1,2,2,2,2,2]
            while (elementData[i] == value && i < size) {
                removeIndex(i);
            }
        }
    }

    public static void main(String[] args) {
        DynamicArrayReview dynamicArrayReview = new DynamicArrayReview();
        dynamicArrayReview.addLast(2);
        dynamicArrayReview.addLast(2);
        dynamicArrayReview.addLast(2);
        dynamicArrayReview.addLast(2);
        // [1,2,2,2]
        System.out.println(dynamicArrayReview);
        dynamicArrayReview.removeValue(2);
        // []
        System.out.println(dynamicArrayReview);
    }

    @Override
    public String toString() {
        String ret = "[";
        for (int i = 0; i < size; i++) {
            ret += elementData[i] + ", ";
        }
        ret += "]";
        return ret;
    }

    private void grow() {
        // 数组拷贝
        elementData = Arrays.copyOf(elementData,elementData.length << 1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值