动态数组的实现_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 动态数组的实现

动态数组的实现

 2014/5/10 2:10:57  肆无忌惮_  程序员俱乐部  我要评论(0)
  • 摘要:用到的知识:1.泛型publicclassArrayQueue<E>{}//E表示元素是什么类型,element2.容量(arr.length)privateintinitVolume;3.增长比率privateintGrowthRate;4.数组长度privateintlength=0;目的:用动态数组实现增加元素,插入元素,移除元素,修改元素等操作Object[]src=newObject[0];add思路:在已知数组最末尾增加元素,先建立新的数组,并初始化容量为旧数组+1
  • 标签:实现 数组

class="MsoNormal">用到的知识:

1.泛型

?

public class ArrayQueue<E> {}//E表示元素是什么类型,element

2.容量(arr.length)

private int initVolume;

3.增长比率

?

private int GrowthRate;

4.数组长度

?

?

private int length=0;

目的:用动态数组实现增加元素,插入元素,移除元素,修改元素等操作

Object[] src=new Object[0];

add思路:在已知数组最末尾增加元素,先建立新的数组,并初始化容量为旧数组+1,将旧数组拷贝到新数组,新元素增加到末尾,用新数组替换旧数组

实现:

public void add(E s){
		//定义一个新数组,用来装数据,长度比src+1
		Object []dest =new Object[src.length+1];
		//将新加进的元素放入新数组的最后一个下标位置
		dest[dest.length-1]=s;
		//将原来数组中的数据按照下标顺序拷贝到新数组
		for(int i=0;i<src.length;i++){
			dest[i] = src[i];
		}
		
		//将src指向新数组
		src = dest;
}

?insert思路:add类似,将旧数组分为两个部分,一部分拷贝到新数组,将插入的元素放到指定位置,再拷贝剩余部分到新数组

实现:

/**
	 * 将指定元素插入到指定位置
	 * @param index 要插入元素的位置,第index个元素
	 * @param s 要插入的新元素
	 */
	public void insert(int index, E s) {
		//定义一个新数组,用来装数据,长度比src+1
				Object []dest =new Object[src.length+1];
				
				if(index>=0&&index<dest.length){
				//将原来数组中的数据按照下标顺序拷贝到新数组
				for(int i=0;i<index;i++){
					dest[i] = src[i];
				}
				for(int i=index;i<src.length;i++){
					dest[i+1] = src[i];
				}
				//将新加进的元素放入新数组的相应位置
				dest[index]=s;
				
				//将src指向新数组
				src = dest;
				}
				
				else{
					System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");
				}
	}

?

移除操作:思路和插入差不多

/**
	 * 移除指定位置的元素
	 * @param index
	 *            要移除的元素的下标,0-src.length-1;
	 */
	public void remove(int index) {
		//定义一个新数组,用来装数据,长度比src+1
		Object []dest =new Object[src.length-1];
		
		if(index>=0&&index<dest.length){
		//将原来数组中的数据按照下标顺序拷贝到新数组
		for(int i=0;i<index;i++){
			dest[i] = src[i];
		}
		for(int i=index;i<src.length-1;i++){
			dest[i] = src[i+1];
		}		
		//将src指向新数组
		src = dest;
		}
		else{
			System.out.println("caozuo.html" target="_blank">删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");
		}
	}

?

上述程序每增加一个数据都得重新分配空间,改进后程序如下:

public class ArrayQueue<E> {//E表示元素是什么类型,element
	private int initVolume;
	private int GrowthRate;
	private int length=0;
	Object[] src;
	
	public ArrayQueue(){
		this.initVolume=900000;
		this.GrowthRate=10000;
		src=new Object[initVolume];
	}
	
	
	/**
	 * 将指定的元素加入容器
	 * @param s 要加入到容器中的元素
	 */
	public void add(E s){
		if(length==src.length){
		
			Object []dest =new Object[src.length+GrowthRate];

			//将原来数组中的数据按照下标顺序拷贝到新数组
//			for(int i=0;i<src.length;i++){
//				dest[i] = src[i];
//			}
			System.arraycopy(src, 0, dest, 0, length);
			//将src指向新数组
			src = dest;
			
		}
		src[length]=s;
		length++;
		
	}
	
	/**
	 * 获取指定下标位置的元素
	 * 
	 * @param index
	 *            要获取的元素的下标
	 * @return 返回获取到的元素
	 */
	public E get(int index){
		return (E)src[index];
	}
	
	/**
	 * 修改指定位置元素的值
	 * 
	 * @param index要修改的元素位置
	 * @param s
	 *            修改后的新元素
	 */
	public void update(int index, E s) {
		if(index>=0&&index<size()){
		src[index]=s;
		}else{
			System.out.println("更新操作指定下标超出范围,请更新从0-"+(src.length-1)+"的元素");
		}
	}
	
	/**
	 * 将指定元素插入到指定位置
	 * @param index 要插入元素的位置,第index个元素
	 * @param s 要插入的新元素
	 */
	public void insert(int index, E s) {
		if(index>=0&&index<length){
			Object[] dest;
			if(length>=src.length-1){//即将超出范围就需要增加容量
			dest =new Object[src.length+GrowthRate];
			
			}else{
				dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量
			}

				//将原来数组中的数据按照下标顺序拷贝到新数组
				System.arraycopy(src, 0, dest, 0, index);
				System.arraycopy(src, index, dest, index+1,src.length-index-1);
					
				//将src指向新数组
				src = dest;
			
			//将新加进的元素放入新数组的相应位置
			src[index]=s;
			length++;
				
	}
				
				else{
					System.out.println("插入操作指定下标超出范围,请插入元素到0-"+(src.length-1)+"的位置");
				}
	}
	
	/**
	 * 移除指定位置的元素
	 * 
	 * @param index
	 *            要移除的元素的下标,0-src.length-1;
	 */
	public void remove(int index) {
		if(index>=0&&index<length){
			Object[] dest;
			if(length>=src.length-1){//即将超出范围就需要增加容量
			dest =new Object[src.length+GrowthRate];
			
			}else{
				dest =new Object[src.length];//至少还差一个超出范围,不需要增加容量
			}

				//将原来数组中的数据按照下标顺序拷贝到新数组
				System.arraycopy(src, 0, dest, 0, index);
				System.arraycopy(src, index+1, dest, index,src.length-index-1);
					
				//将src指向新数组
				src = dest;

			length--;
				
	}
		else{
			System.out.println("删除操作指定下标超出范围,请删除从0-"+(src.length-1)+"的元素");
		}
	}

	/**
	 * 获得容器中元素个数的方法
	 * 
	 * @return 返回元素的个数
	 */
	public int size() {
		return length;
	}
}

?

public class Demo {
	public static void main(String args[]){
		ArrayQueue<String> queue =new ArrayQueue();

		long t1=System.currentTimeMillis();	
		for(int i=0;i<1000000;i++){
			queue.add(""+i);
		}

		
		long t2=System.currentTimeMillis();	
		for(int i=0;i<queue.size();i++){
			System.out.println(queue.get(i));	
		}
		
		System.out.println(t2-t1);
		/**测试不同容量.增长比率对时间的影响
		 * this.initVolume=900000;
		 *this.GrowthRate=10000;
		 *t2-t1=891
		 *this.initVolume=9000;
		 *this.GrowthRate=100;
		 *t2-t1=7792
		 */

	}
	
}

?

发表评论
用户名: 匿名