在实际生活中,一段数组我们有可能会对其进行增删查改,当我们对数组进行改动后就有可能改变了数组的大小,若是我们每一次改动后都将数组重新开辟空间拷贝过去会相对来说比较麻烦,所以产生了动态数组,对于实际运用来说会比较灵活。动态数组就是在声明的时候没有明确数组大小的数组。
当我们创建了一个动态数组后,需要完善进行增、删、查、改的操作。
public class DynamicArray {
//定义属性
//定义存储具体元素的数组
private int[] elementData;
//定义当前数组存储元素的个数
private int size;
//得到当前数组的长度
public int getSize() {
return size;
}
//构造函数
public DynamicArray() {
//若在使用时没有给定数组大小,则先开辟10个空间
this.elementData = new int[10];
}
public DynamicArray(int size) {
//若给定了数组的大小,则开辟size个空间
this.elementData = new int[size];
}
private void grow() {
//旧的数组的长度
int oldLength = elementData.length;
//设置新数组的长度为就数组的两倍
int newLength = oldLength << 1;
//将原来的数组拷贝到新数组里
elementData = Arrays.copyOf(elementData, newLength);
}
public void addFirst(int data) {
//判断数组的空间是否已满,若是满的我们再插入一个元素后会溢出
if (size == elementData.length) {
//若空间已满,我们需要对数组进行扩容
grow();
}
//我们要在数组头部插入元素就需要先将现有的所有元素向后移一位,将头部的位置空出来
for (int i = size - 1; i >= 0; i--) {
elementData[i + 1] = elementData[i];
}
elementData[0] = data;
size++;
}
public void addLast(int data){
//判断数组的空间是否已满,若是满的我们再插入一个元素后会溢出
if(size==elementData.length)
{
grow();
}
elementData[size]=data;
size++;
}
public void addIndex(int index,int data){
//判断数组的空间是否已满,若是满的我们再插入一个元素后会溢出
if(size==elementData.length)
{
grow();
}
//如果在0下标处插入元素就是头插,调用addFirst方法
if(index==0)
{
addFirst(data);
}
//如果在size下标处插入元素就是尾插,调用addLast方法
if(index==size)
{
addLast(data);
}
//在中间位置插入元素,也是将该位置开始所有的元素向后移一个将该位置空出来,把元素插入
if(index < 0 || index > size)
{
System.out.println("该下标不存在!");
}
else
{
for (int i = size-1; i >= index; i--) {
elementData[i+1]=elementData[i];
}
elementData[index]=data;
size++;
}
}
public boolean checkIndex(int index){
if(index < 0 || index > size-1)
{
System.out.println("该下标不存在!");
return false;
}
return true;
}
public void removeIndex(int index){
//先判断要删除的下标是否合法
if(checkIndex(index))
{
//将该下标开始的元素全部向前移一位
for (int i = index; i < size-1; i++) {
elementData[i]=elementData[i+1];
}
size--;
}
}
public boolean checkData(int data){
for (int i = 0; i < size; i++) {
if(elementData[i]==data)
{
return true;
}
}
System.out.println("该元素不存在!");
return false;
}
public void removeData(int data){
if(checkData(data))
{
for (int i = 0; i < size; i++) {
while(elementData[i]==data)
{
removeIndex(i);
}
}
}
}
public void getIndex(int index){
//判断索引是否合法
if(checkIndex(index))
{
//返回该下标元素
System.out.println(elementData[index]);
}
}
public void getData(int data){
//判断元素是否存在
if(checkData(data))
{
//循环输出下标
String ret="[";
for (int i = 0; i < size; i++) {
if (elementData[i]==data)
{
ret+=i;
ret+=" ";
}
}
ret+="]";
System.out.println(ret);
}
}
public void alterIndex(int index,int data){
if (checkIndex(index))
{
elementData[index]=data;
}
}
public void alterData(int oldData,int newData){
//判断元素是否合法
if(checkData(oldData))
{
for (int i = 0; i < size; i++) {
//将新的元素赋给旧的元素
while (elementData[i]==oldData)
{
elementData[i]=newData;
}
}
}
}
@Override
public String toString() {
String ret="[";
for (int i = 0; i < size-1; i++) {
ret+=elementData[i];
ret+=",";
}
ret+=elementData[size-1]+"]";
return ret;
}
public static void main(String[] args) {
DynamicArray dynamicArray=new DynamicArray();
dynamicArray.addFirst(5);
dynamicArray.addLast(3);
dynamicArray.addFirst(1);
dynamicArray.addIndex(1,2);
dynamicArray.addIndex(1,2);
dynamicArray.addLast(9);
dynamicArray.addIndex(4,2);
System.out.println(dynamicArray);
dynamicArray.alterIndex(3,6);
System.out.println(dynamicArray);
}
}



