动态数组的实现案例

Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是List。下面介绍一下List作为Java动态数组的用法。

我们可以首先编写两个类List.java  和一个测试类Test1.java。将主类和测试类分开写,更有利于扩展性,这是一个非常好的编程思想。下面来看一下我们如何来实现List类。注释已经写得很清楚了,如果有不懂的地方欢迎留言。

//定义一个容器类
public class List{
	final int INIT_LENGTH=10;
	int[] array=new int[INIT_LENGTH];
	int index=-1;

	int add(int [] newArray){
		int temp=index;
		if(newArray==null){
			System.out.println("数组不能为空");
			return -1;
		}

	if(index+1+newArray.length>array.length){
		int newlength=(index+1+newArray.length)*2;
		expand(newlength);
	}
	System.arraycopy(newArray,0,array,index+1,newArray.length);
	index=index+newArray.length;
	return temp+1;
	}

	//方法的重载
	void expand(int newlength){
		//新创建一个数组,这个新数组的长度两倍大
		int[] x=new int[newlength];
		//复制array中的数据到x中
		System.arraycopy(array,0,x,0,array.length);
		array=x;
	}

	void expand(){
		//新创建一个数组,这个新数组的长度两倍大
		int[] x=new int[array.length*2];
		//复制array中的数据到x中
		System.arraycopy(array,0,x,0,array.length);
		array=x;
	}

	//输出指定位置的元素
	int remove(int i){
		//判断i是否存在
		if(i>=0&&i<index){
			System.arraycopy(array,i+1,array,i,index-i);
			index--;
		}else{
			System.out.println("集合中没有这个索引"+i);
			return -1;
		}
		return -1;
	}


	//添加元素到指定位置
	//value:要添加的值
	//i:添加到数组的位置
	//返回值:添加元素的索引
	int add(int value,int i){
		if(i<0||i>index+1){
			System.out.println("索引越界"+i);
			return -1;
		}
	if(index>=array.length-1){
		expand();
	}

	index++;
	System.arraycopy(array,i,array,i+1,index-i);
	array[i]=value;
	return i;

	}
	//清空
	void clear(){
		array=new int[INIT_LENGTH];
		index=-1;
	}

	//求出容器的真实大小
	int size(){
		return index+1;
	}

	void add(int value){
		if( index>=array.length-1){
			expand();

		}
		index++;
		array[index]=value;
	}

	int[] getArray(){

		//新创建一个数组
		int[] result=new int[index+1];

		System.arraycopy(array,0,result,0,index+1);
		return result;
	}
}

接下来,我们把测试类写好。

public class Test1{
	public static void main(String[] args){
		List list=new List();
		int[] r=list.getArray();
		for(int t:r){
			System.out.println(t);
		}

	//开始存元素
	list.add(1);
	list.add(2);
	r=list.getArray();
	for(int t:r){
		System.out.println(t);
	}

	System.out.println("list容器中有"+list.size());
	for(int i=0;i<10;i++){
		list.add(i);
	}
	//存完后
	r=list.getArray();

	for(int t:r){
		System.out.println(t);
	}
	System.out.println("list容器中有"+list.size());
	System.out.println("清空===================");
	list.clear();
	System.out.println("清空后,list容器中有"+list.size());

	System.out.println("移除===================");
	for(int i=0;i<10;i++){
		list.add(i);
	}
	list.remove(3);
	r=list.getArray();

	for(int t:r){
		System.out.println(t);
	}
	System.out.println("在指定位置添加元素");
	list.add(888,1000);
	r=list.getArray();
}
}
然后呢,我们使用javac Test1.java     

java Test1

就可以顺利编译运行了。


posted @ 2016-03-10 14:42  朱培  阅读(155)  评论(0编辑  收藏  举报