ds_动态数组

文章介绍了如何在Java中实现动态数组,包括创建MyArray类,重写toString方法,以及添加增加、查询、修改和删除元素的方法。动态数组允许根据元素数量自动调整大小,并提供了添加元素至末尾或指定位置,查找元素,修改指定索引的元素,以及删除元素的功能。测试类展示了这些方法的实际应用。
摘要由CSDN通过智能技术生成

动态数组的增删改查


一、动态数组是什么?

动态数组就是在普通数组上,增加了一个可以根据元素的个数动态调整数组大小的功能。以下以int类型数组为例。

二、使用步骤

1.创建MyArray类

代码如下(示例):

/*
 * @Description: 基于int类型的动态数组,根据元素的个数来动态调整数组大小,包括增删改查
 * @author: Z
 * @date: 2023/4/11 15:42
 * @param null:
 * @Return:
 */
public class MyArray {
    //用int类型来存放数组
    private int[] data;
    //size代表有效元素个数且是下一个位置的索引
    private int size;

    //空参构造 默认初始化大小
    public MyArray() {
        this(10);
    }

    //构造函数 传入一个参数用来初始化数组的大小
    public MyArray(int initCap) {
        this.data = new int[initCap];
    }

2.重写toString方法

代码如下(示例):

 public String toString() {
        String str = "[";
        for (int i = 0; i < size; i++) {
            str = str + data[i];
            if (i != size - 1) {
                str = str + ", ";
            }
        }
        str = str + "]";
        return str;
    }

也可以使用StringBuilder,输出有效元素。


3.添加增加方法

代码如下(示例):

/*增:向当前动态数组中添加元素。添加到有效元素的末尾*/
    public void add(int val) {
        data[size] = val;
        size++;
        //数组已满时,扩大数组
        if (size == data.length) {
            grow();
        }
    }

    /*增:向当前动态数组中添加指定索引的元素*/
    public void addIndex(int index, int val) {
        //首先判断index索引是否是一个非法索引
        if (index < 0 || index > size) {
            System.err.println("add index illegal!");
            return;
        }
        //到这一步说明index合法,把index包含自己之后的元素后移存储,从最后一个元素存储
        for (int i = size - 1; i >= index; i--) {
            data[i + 1] = data[i];
        }
        //把元素插入到指定索引
        data[index] = val;
        //有效元素位置后移
        size++;
        //判断数组是否已满
        if (size == data.length) {
            grow();
        }
    }

    //扩大原有数组的长度
    private void grow() {
        this.data = Arrays.copyOf(data, data.length * 2);
    }

4.添加查询方法

代码如下(示例):

/*查询:查询当前动态数组中出现第一个值为val的元素索引*/
    public int getIndex(int val) {
        for (int i = 0; i < size; i++) {
            if (data[i] == val) {
                return i;
            }
        }
        return -1;
    }

    /*查询:当前动态数组中是否包含值为val的元素,存在返回true*/
    public boolean contains(int val) {
        //如果不等于-1那就是查询到了返回true
        return getIndex(val) != -1;
    }

    /*查询:查询当前动态数组中索引为index的元素值*/
    public int getByValue(int index) {
        //判断边界条件:index是否非法
        if (index < 0 || index >= size) {
            System.err.println("get index illegal!");
            return -1;
        }
        //合法返回有效值
        return data[index];
    }

5.添加修改方法

代码如下(示例):

/*增:向当前动态数组中添加元素。添加到有效元素的末尾*/
    /*修改:修改指定索引index的元素值变为newVal,返回修改前的值*/
    public int set(int index, int newVal) {
        //判断边界条件
        if (index < 0 || index >= size) {
            System.err.println("set index illegal!");
            return -1;
        }
        int oldVal = data[index];
        data[index] = newVal;
        return oldVal;
    }

    /*修改:修改第一个旧元素的值oldVal变为新的元素值newVal,返回是否成功,true*/
    public boolean setValue(int oldVal, int newVal) {
        //得到旧元素的索引 查询
        int index = getIndex(oldVal);
        //判断index是否有效
        if (index != -1) {
            data[index] = newVal;
            return true;
        }
        //旧元素的索引不存在
        System.err.println("old value is not exists!");
        return false;
    }

6.添加删除方法

代码如下(示例):

 /*删除:删除指定索引index对应的元素值,返回删除前的元素*/
    public int removeIndex(int index) {
        //判断index边界
        if (index < 0 || index >= size) {
            System.err.println("remove index illegal!");
            return -1;
        }
        //记录删除前的元素值
        int oldVal = data[index];
        //将index以后的元素向前移动,直到size-1
        for (int i = index; i < size - 1; i++) {
            data[i] = data[i + 1];
        }
        //有效元素位置减少
        size--;
        return oldVal;
    }
    /*删除数组的头元素*/
    public int removeFirst(){
        return removeIndex(0);
    }
    /*删除数组的尾元素*/
    public int removeLast(){
        return removeIndex(size-1);
    }
    /*删除第一个值为val的元素,返回是否删除成功*/
    public boolean removeByValueOnce(int val){
        for (int i = 0; i < size; i++) {
            if (data[i]==val){
                //此时的i索引就是要删除的那个元素值所在的位置
                removeIndex(i);
                return true;
            }
        }
        return false;
    }
    /*删除当前数组中所有值为val的全部元素,返回是否删除成功*/
    public boolean removeAllValue(int val){
        for (int i = 0; i < size; ) {
            if (!removeByValueOnce(val)){ //如果是false直接返回false,结束方法
                return false;
            }
            //如果不是flase循环继续
            i++;
        }
        //循环结束,所有指定元素被删除返回true
        return true;
    }

7.创建测试类

代码如下(示例):

public class Test {
    public static void main(String[] args) {
        MyArray myArray=new MyArray(5);
        //测试增
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.addIndex(1,10);//[10,10,20,30]
        System.out.println(myArray);
        myArray.addIndex(3,50);//[10,10,20,50,30]
        System.out.println(myArray);
        System.out.println("---------------------");
        //测试查
        System.out.println(myArray.getIndex(10));//0
        System.out.println(myArray.getByValue(3));//50
        System.out.println(myArray.contains(60));//false
        System.out.println("---------------------");
        //测试修改
        System.out.println(myArray.set(0,20));//原来修改的值10
        System.out.println(myArray.setValue(50,100));//返回true

        System.out.println(myArray);//结果[20,10,20,100,30]
        System.out.println("---------------------");
        //测试删除
        System.out.println(myArray.removeIndex(3));//删除的原来值100
        System.out.println(myArray.removeByValueOnce(20));//true

        System.out.println(myArray);//结果[10,20,30]
        //添加两个20
        myArray.add(20);
        myArray.add(20);
        System.out.println(myArray);//[10, 20, 30, 20, 20]
        //删除全部20
        System.out.println(myArray.removeAllValue(20));//true
        System.out.println(myArray);//[10, 30]
        //添加100 删除首尾元素
        myArray.add(100);
        myArray.removeFirst();
        myArray.removeLast();
        System.out.println(myArray);//[30]
    }
}

三、总结

1.System.err和System.out就是错误输出和标准输出,使用System.err来报告错误。
2.toString方法:调用println方法传入一个引用对象时,默认调用的就是该对象的toString方法。不需要使用myArray.toString。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值