数据结构——数组

数组增删改查,创建一个ArrayList方法,写出(add()增加,insert()插入,delete()删除一个元素,deleteall()删除这个数组中所有相同元素,orderInsert()有序数组插入的操作)。

基本变量

int[] arr;
	//默认存储个数为10
	int size;//有效数字个数
	int capacity;//容量
	double factor;//因数
	
	public ArrayList() {
		factor = 1.5;
		size = 0;
		capacity = 10;
		arr = new int[capacity]; 
	}

1,增加元素

	public void add(int value) {
		if(size == arr.length) {
			capacity = (int)(capacity*factor);
			int[] temp = new int[capacity];
			for(int i = 0;i<arr.length;i++) {
				temp[i]=arr[i];
			}
			arr = temp;
		}
		//插入数据
		arr[size] = value;
		size++; 
	}

当有效元素个数等于容量长度时,容量扩大1.5倍,新创建一个数组,并将原数组的值复制到新数组中,且地址也只想原数组。

 2,插入元素

public void insert(int value,int position) {
		if(position<0||position>size) {
			System.out.println("插入位置不合理");
			return;
		} 
		if(size == arr.length) {
			capacity = (int)(capacity*factor);
			int[] temp = new int[capacity];
			for(int i = 0;i<arr.length;i++) {
				temp[i]=arr[i];
			}
			arr = temp;
		}
		for(int i = size - 1;i>=position;i--) {
			arr[i+1] = arr[i];
		}
		arr[position] = value;
		size++;	 
	}

首先判断插入位置是否位于数组中,然后判断是否要扩容,最后将位于插入位置之后的元素从最后一个开始一个个后移。

 3,删除一个元素

public boolean delete(int value) {
		
		for(int i = 0;i<size;i++) {
			if(arr[i] == value) {
				for(int j = i;j<size-1;j++) {
					arr[j] = arr[j+1];
				}
				size--;
				return true;
			}	
		}
		return false;
	}

重新遍历数组找到第一个要删除的元素,将其从后一个元素开始将后一个覆盖前一个元素完成删除。

4,删除数组中所有相同元素

public boolean deleteall(int value) {
		boolean isFond = false;
		for(int i = size;i>=0;i--) {
			if(arr[i] == value) {
				for(int j = i;j<size-1;j++) {
					arr[j] = arr[j+1];
				}
				size--;
				isFond = true;				
			}	
		}
		return isFond; 
	}

与delete()不同,要从最后一个元素开始向前遍历,找到每个要删除元素后,再将其用后面元素覆盖,这样不会漏掉。

 5,有序数组的插入

public void orderInsert(int value) {
		if(size == arr.length) {
			//满了扩容
			capacity = (int)(capacity*factor);
			int[] temp = new int[capacity];
			for(int i = 0;i<arr.length;i++) {
				temp[i]=arr[i];
			}
			arr = temp;
		}
		//插入 
		if(size == 0) {
			arr[0] = value;
		}else if(arr[size-1]<=value){
			arr[size] = value;			
		}else {
			for(int i = 0;i<size;i++) {
				if(arr[i] > value) {
					//i即为要插入的位置
					//插入位置及其之后的数据统一向后移动					
					for(int temp = size - 1;temp>=i;temp--) {
						arr[temp+1] = arr[temp];						
					}
					//插入数据
					arr[i] = value;
					break;
				}
			}
		}
		size++;
	}

}

首先判断是否要满,然后判断插入的位置最大就在最后,没有元素就是第一个,都不是,就从头遍历,插入位置及其之后的数据统一向后移动,因为是要插入一个元素,而函数第一步就确保数组一定会有大于一的空位,所以不会溢出。

 如何确保打印出来数组

ArrayList list = new ArrayList();

ArrayList的返回值可以是一个字符串

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

通过字符串拼接来打印数组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值