优化后的版本:
(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类时要测试各个方法的所有情况