队列(动态数组)的创建与测试

优化后的版本:

(1)队列接口ListInterface

 

public interface ListInterface<E> {
	//添加元素
	public void add(E e);
	//取得元素
	public E get(int index);
	//删除元素
	public void delete(int index);
	//删除所有元素
	public void deleteAll();
	//插入元素
	public void insert(E e,int index);
	//修改元素
	public void modify(E e,int index);
	//取得队列的实际大小
	public int size();
	

}

 (2)队列接口实现类

public class ListImp<E> implements ListInterface<E> {
	//创建属性:队列初始大小、变化率
	private int initNum=10;
	private int num=10;
	//创建原队列对象
	Object[] src=new Object[10];
	//构造函数
	public ListImp(){}
	public ListImp(int n){
		this.num=n;
	}
	public ListImp(int initN,int n){
		this.initNum=initN;
		this.num=n;
	}
	//添加元素
	public void add(E e){
		if(this.size()>=src.length){
			Object[] dest=new Object[src.length+num];
			System.arraycopy(src, 0, dest, 0, src.length);
			src=dest;
		}
		src[this.size()]=e;
		
		
	}
	//取得元素
	public E get(int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
			return null;
		}
		else
		return (E)src[index];
		
	}
	//删除元素
	public void delete(int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
		}
		else{
		Object[] dest1=new Object[src.length-1];
		System.arraycopy(src, 0, dest1,0,index);
		System.arraycopy(src,index+1,dest1,index,this.size()-index-1);
		src=dest1;
		}
		
	}
	//删除所有元素
	public void deleteAll(){
		src=new Object[0];
		
	}
	//插入元素
	public void insert(E e,int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
		}
		else{
		if(this.size()>=src.length){
			Object[] dest2=new Object[src.length+num];
			System.arraycopy(src, 0, dest2,0,src.length);
			src=dest2;
		}
		for(int i=this.size();i>index;i--){
			src[i]=src[i-1];
		}
		src[index]=e;
		}
		
	}
	//修改元素
	public void modify(E e,int index){
		this.delete(index);
		this.insert(e, index);
		
	}
	//取得队列的实际大小
	public int size(){
		int count=0;
		for(int i=0;i<src.length;i++){
			if(src[i]!=null){
			count++;
			}
		}
		return count;
	}



}

  

(3)队列类的测试

 

public class ListTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ListImp<String> list=new ListImp<String>(5,10);
		//为队列插入4个元素(<5)
		for(int i=0;i<4;i++){
			list.add("元素"+i);
		}
		//为队列插入10个元素(>5)
//		for(int i=0;i<10;i++){
//			list.add("元素"+i);
//		}
		//为下标为-1的位置插入元素
		list.insert("新插入的元素0", -1);
		//为下标为10的位置插入元素(>=4)
        list.insert("新插入的元素1", 4);
        //为下标为2的位置插入元素(<4)
        list.insert("新插入的元素2", 2);
        //修改下标为-1的元素
        list.modify("修改后的元素0", -1);
        //修改下标为4的元素(>=4)
		list.modify("修改后的元素1", 4);
		//修改下标为2的元素(<4)
		list.modify("修改后的元素2", 2);
		//同上测试delete(int index)方法
		list.delete(-1);
		list.delete(4);
		list.delete(2);
		//测试deleteAll()方法
		list.deleteAll();
		//将队列中的所有元素输出
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}

	}

}

 优化的地方:

1、泛型的运用:将队列存储元素的范围扩大为所有类对象(除基本数据类型)

2、为队列中的存储元素数组src设置初始大小initNum和大小的增长率num,这样可以通过判断数组的存储满否情况来创建新的存储数组,而勿需每次操作都创建一次新数组,提高了程序运行速率(减少相同的操作)

3、运用System.arraycopy(Object.src,int srcpos,Object dest,int destpos,int length);方法替代for循环语句,提高了程序运行速率(学会运用已有的类方法)

4、重载ListImp类的构造方法,让用户自己为属性initNum和num赋值,从而增加程序的用户交互性

5、考虑到index的各种取值,故需要if条件判断语句,从而增加程序的完整性

易错的地方(需要注意的地方):

1、添加泛型后,各种形参、返回值、均变为泛型;同时定义数组时不能使用泛型(故使用Object),因此get(int index)函数的返回值必须进行强制转换

2、deleteAll()方法中直接令src=new Object[0]即可

3、两个方法不能相互调用,否则会形成死循环

4、测试ListImp类时要测试各个方法的所有情况

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值