顺序表中给定下标 插入 删除某数据

import java.util.Arrays;

public class ArrayList{
	private int size = 0;
	private int[] array;   //这里先不初始化,在构造方法里初始化,
	public ArrayList(int[] array){          
		this.array = new int[array.length]; 
        // this.array是指属性中的array,而不是形参array.
		for(int i = 0; i < array.length; i++){  //把传入数组的所有元素copy到属性array中
			this.array[i] = array[i];  //把所有数据传进这里面来
		}	
		                       
							  
		size = array.length;  //已存入一些数据,更新size
	}
	
    //在下标index处插入某个数据,对index做合法性校验
	public void insert(int index, int element){
		//index的取值范围[0,size]
		if(index < 0 || index > size){ //若index超出取值范围则index不合法
			System.out.printf("index 取值范围是 [0,%d]%n", size);
			return;  
		}
		
		//确保空间够用,否则扩容
		ensureCapacity();
	
        //插入过程
	    for(int i = size - 1; i >= index; i--){  倒着遍历,所以是i--
		   array[i + 1] = array[i]; //要将[index, size-1]数据往后搬移一格
	    }
	    array[index] = element; // 插入数据
	    size++;
	}
	
	//删除下标index所在数据元素,要求对 index 做合法性校验
	public void erase(int index){
		//index的取值范围[0, size - 1] 
		if(index < 0 || index >= size){
			System.out.printf("index的取值范围是[0, %d]%n",size-1);
			return;
		}
		
		//删除过程: 
		for(int i = index + 1; i <= size-1; i++){  //要从前往后遍历
			array[i - 1] = array[i]; //要把[index + 1, size - 1]的数据往前移动一格
		}
		size--; //删除了size里面的一个元素,size当然减少,相当于 size-1
	
	}
	
	private void ensureCapacity(){  //因为扩容是内部用的,所以用private
		if(size < array.length){  // size是现在有的数据,array.length是容量
			return;  // 现在是够用的
		}
		//否则进行扩容
		//1. 申请新空间,新空间大小通常为原空间的1.5或者2倍-
		int oldCapacity = array.length;
		int newCapacity = oldCapacity + oldCapacity / 2;
		int[] newArray = new int[newCapacity];
		//2.将数据搬到新家
		for(int i = 0; i < size; i++){
			newArray[i] = array[i];
		}
		//3.通知大家我的新地址
        array = newArray;
        //4.释放老空间,GC 会去回收(java里面自动回收)		
		
		
	}
	
	public String toString(){
		return Arrays.toString(
		    Arrays.copyOf(array, size) //从array这个位置拷size个值出来
		);
	} 
	
	public static void main(String[] args){
		int[] array = {1, 2, 3, 4, 5};
		ArrayList arrayList = new ArrayList(array); //构造方法就会把array这个数组拷贝到自己的顺序表中,通过这种方式去初始化
		System.out.println(arrayList.toString()); //插入之前的样子
		arrayList.insert(5, 106);  //不扩容之前:会报错(因为数组空间越界,需要扩容) 因为数组空间只有5个,插入后需要6个空间,因此需要扩容
		System.out.println(arrayList.toString()); //插入之后的样子
		arrayList.erase(1);  //删掉数组 1 位置这个数据
		System.out.println(arrayList.toString());
	}
} 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值