数据结构-----动态数组

动态数组基本操作

通常我们创建一个数组便会对其初始化,使其容量为定值。对于应用中的某些问题,例如:添加未知数个对象...到某一容器中,这时候容量不变的数组(当然你也可以选择单列或双列集合)可能满足不了我们的需求。那么我们怎么将一个数组的容量变成动态的呢??下面我们来写一些方法使其成为你想让它成为的样子。

1、插入/添加元素
package suanfa;

public class Dongtaishuzu {
	int size;
	int element;//添加的元素
	int array[]=new int[size];
    //插入、添加
	public void addist(int elemennt) {
		add(size,element);
	}
	private void add(int index, int element) {
		// TODO Auto-generated method stub
		if(index>=0&&index<size) {
			System.arraycopy(array,index,array,index+1,size-index);
		}
		array[index]=element;
		size++;
	}
}

注:再添加元素方法中,我们使用了一个Java方法:System.arraycopy(源数组,源数组的实际拷贝位置(即添加的位置),目标数组,目标数组的实际拷贝位置,拷贝长度),我们使用这个方法可以很好地将数组扩容。

同理:删除操作也使用arraycopy方法:

2、删除元素
//删除
	public int remove(int index) {
		int removed=array[index];//想要在原数组中删除的元素
		System.arraycopy(array,index+1,array,index,size-index-1);
		size--;
		return removed;
	}
代码解读:

index+1为想要删除的元素的索引位置;拷贝的长度为size-index-1。自己可以举一个实际例子会更好理解。

3、扩容
//扩容
	int capacity;//想要扩大的容量
	public void addd(int index,int element) {
		if(size==capacity) {
			capacity+=capacity>>1;
		int []newArray=new int[capacity];
		System.arraycopy(array,0,newArray,0,size);
		}
	}
代码解读:

上述代码中的当size==ccapacity其情况:其capacity容量可以自定义。

4、遍历
①函数式接口consumer遍历(其本质为for循环演变为增强for)

代码演示:

//遍历
	public void forEach(Consumer<T>consumer) {
		for(int i=0;i<size;i++) {
			consumer.accept(array[i]);
		}
	}
注意:

①使用函数式接口前需要导包:import java.util.function.Consumer;

②“T”为泛型:它是根据你所定义的数组的数据类型来判定的。(类似于集合中的泛型)

②迭代器遍历
	public Iterator<T>iterator(){
		return new Iterator<T>() {
			public boolean hasNext() {
				return false;
			}
			public T next() {
				return null;
			}
		}
注意: 

①在使用迭代器遍历时需要导包:import java.util.Iterator;

②使用前要先获取迭代器对象:Iterator<T>iterator=数组名/集合名 . iterator(创建指针,默认指向0索引)

③hasNext()是判断当前位置是否有元素;next()是获取当前位置的元素,将迭代器对象传下一位。

详细代码:

public boolean hasNext() {
				return false;
			}
			public T next() {
				while(ie.hasNext()) {
					String str=it.next();
					System.out.println(str);
				}
			}

④迭代器遍历完,它不会复位。要想第二次遍历,只能再次获取新的迭代器对象。 

拓展

对于在动态数组中添加或删除性能:

头部位置:时间复杂度为:O(n)

尾部位置:时间复杂度为:O(1)

中部位置:时间复杂度为:O(n)

下一次我们将详细介绍单列和双列集合以及泛型................

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值