class="MsoNormal">用到的知识:
1.泛型
?
public class ArrayQueue {}//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
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
//将原来数组中的数据按照下标顺序拷贝到新数组
for(int i=0;i
dest[i] = src[i];
}
for(int i=index;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
//将原来数组中的数据按照下标顺序拷贝到新数组
for(int i=0;i
dest[i] = src[i];
}
for(int i=index;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表示元素是什么类型,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
//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
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
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
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 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
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
*/
}
}
?