行列(动态数组)的创建与测试
队列(动态数组)的创建与测试
优化后的版本:
(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类时要测试各个方法的所有情况