动态数组的增删改查
文章目录
一、动态数组是什么?
动态数组就是在普通数组上,增加了一个可以根据元素的个数动态调整数组大小的功能。以下以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。