引言
本文主要针对动态数组的增删改查四种情况,分别介绍了自己学习的几种方法,提供给大家学习。
创建一个数组
为了实现动态数组的增删改查,我们需要将数组定义为一个类的对象,再通过一个个成员方法来实现这些功能。
public class MyArray {
//储存数据的整形数组
private int[] date;
//数组储存元素个数
private int size;
public MyArray(){
//默认长度为10
this(10);
}
//从外部传入数组长度
public MyArray(int initCap) {
this.date = new int[initCap];
}
动态数组的自主扩容
动态数组大小不能确定需要通过元素数量来进行自主扩容,并且通过Arrays.copyOf方法进行原来数组的元素的复制,并且进行数组容量的扩容,扩容为原来容量2倍的数组。
/***
* 用private权限定义,是因为数组扩容使外界不可见的
*/
private void grow() {
//copyOf方法一定要返回原来的数组才能实现复制和扩容。
this.date = Arrays.copyOf(date,date.length*2);
}
}
动态数组的增加
动态数组的增加一定要注意进行判断是否越界,及时调用扩容方法进行数组的扩容。
1.储存数组元素
通过调用成员方法增加一个整型的元素。
/**
* 将一个整型数val存入数组
* @param val
*/
public void add(int val){
//将val的值存入数组
date[size] = val;
size++;
if (size==date.length){
//发现当前数组已满。
grow();
}
}
2.规定位置增加元素
给定一个元素索引和一个新的元素,进行元素增加,在索引位置添加元素
1.首先需要判断索引是否合法。
2.动态数组的增加需要进行元素的搬移,从最后一个有效元素到插入元素索引位开始往后移一位,arr[i+1] = arr[i];空出规定索引位,以便于元素的插入。
public void add(int index,int val){
//判断边界条件,index是一个非法的索引
//size是有效的元素个数index == size
//插入时index= size,就是再数组尾部插入
//index = 0时就是从头插入
if (index<0||index>size){
//错误输入
System.out.println("add index illegal!");
return;
}
//从当前最后一个有效元素开始向后搬移,空出index
for (int i = size-1; i >=index; i--) {
date[i+1] =date[i];
}
date[index]=val;
size++;
if(size == date.length){
grow();
}
}
动态数组的查询
1.查询规定值,并且输出第一个规定值所在的索引
进行数组遍历,出现目标值即输出索引。
/**
* 查询当前·动态数组第一个值为val的元素位置并且输出当前元素的索引
* 若不存在是输出-1
* @param val
* @return
*/
public int getByValue(int val){
//遍历当前的动态数组
for (int i = 0; i < size; i++) {
if (date[i] == val){
return i;
}
}
return -1;
}
2.给定索引,输出索引位置元素
进行索引合法判断,在进行索引元素输出。
/**
* 给定索引输出索引位元素
* @param index
* @return
*/
public int get(int index){
//判断index是否合法
//不包含size
if (index <0||index>=size){
System.err.println("get index illegal!");
return -1;
}
return date[index];
}
动态数组的修改
1.通过给定索引修改数值,并且输出原来元素
/**
* 修改数组中索引为index位置的元素为newVal,并且输出原来的元素。
* @param index
* @param newVal
* @return
*/
public int set(int index, int newVal){
if (index <0||index>=size) {
System.err.println("get index illegal!");
return -1;
}
int oldVal = date[index];
date[index] = newVal;
return oldVal;
}
2.给定一个值,找到这个值并且进行修改
调用动态数组查找元素索引方法,之后再根据索引进行具体位置元素的修改即可。
/**
* 将动态数组中的第一个值为oldVal的替换成newVal
* 并且输出true,如果没有oldVal输出false
* @param oldVal
* @param newVal
* @return
*/
public boolean setValue(int oldVal,int newVal) {
int index = getByValue(oldVal);
if (index != -1) {
date[index] = newVal;
return true;
}
System.err.println("old value is not exist!");
return false;
}
动态数组的删除
通过删除元素的后一位元素进行向前移动覆盖要的删除的元素的方式进行删除,从要删除元素后一位开始一直到最后一位有效元素全部向前移动一位。就进行动态数组元素的删除
1.给定元素索引进行删除动态数组的元素
通过给定索引元素的后一位元素进行向前移动覆盖要的删除的元素的方式进行删除,从规定索引后一位开始一直到最后一位优秀元素全部向前移动一位。就进行动态数组元素的删除。
/**
* 元素搬移,从index开始,后一个元素覆盖前一个元素,实现元素删除
* @param index
* @return
*/
public int removeIndex(int index){
if (index<0||index>= size){
System.err.println("remove index illegal!");
return -1;
}
//
int oldVal = date[index];
for (int i = index ; i <size-1 ; i++) {
date[i] = date[i+1];
}
size--;
return oldVal;
}
/**
* 删除动态数组第一个元素并输出
* @return
*/
public int removeFirst(){
return removeIndex(0);
}
/**
* 删除动态数组最后一个元素,并输出
* @return
*/
public int removeLast(){
return removeIndex(size-1);
}
2.给定元素进行删除动态数组元素
通过元素遍历进行查找元素,再通过索引删除元素方法进行元素删除。
/**
* 删除当前动态数组中第一个val,并且删除成功输出true,否则输出false
* @param val
* @return
*/
public boolean removeByValueOnce(int val){
for (int i = 0; i < size; i++) {
if (date[i] ==val) {
removeIndex(i);
return true;
}
}
return false;
}
/**
* 删除当前动态数组中所有val,如果有删除val的话输出true,若没有输出false
* @param val
* @return
*/
public boolean removeAllValueOnce(int val){
int count = 0;
for (int i = 0; i < size; i++) {
if (date[i] ==val) {
removeIndex(i);
count++;
}
}
if (count > 0){
return true;
}else {
return false;
}
}
总结
1.动态数组的增删改查过程中到一定判断索引的合法性。
2.动态数组的元素增加时一定要引用动态数组的扩容方法,保证动态数组能够全部储存所有元素。
3.对于动态数组边界问题一定要再三考虑,可以通过画图方式寻找边界点。