public class ArrayBox {
//描述事物
//属性
//教室容量
private static final int DEFAULT_CAPACITY = 10;
public int[] elementDate; //长度一旦确定不能再次发生改变
private int size = 0; //教室中有效元素个数
public ArrayBox(){
elementDate = new int[DEFAULT_CAPACITY];
}
public ArrayBox(int capacity){
elementDate = new int[capacity];
}
//小A同学
//设计一个方法 帮我自己做事 确保内部容量
// 提供条件 老师需要的最小容量
// 没有返回值
private void ensureCapecityInternal(int minCapacity){
if(minCapacity - elementDate.length > 0){
//老师需要的最小容量比教室的大 存不下啦
//扩容-->B同学
this.grow(minCapacity);
}
}
//设计一个方法帮助教室扩容(找一个新教室) 小B同学--数学很好
// 需要提供一个条件 老师需要的最小容量
private void grow(int minCapacity){
//先获取旧教室长度
int oldCapacity = elementDate.length;
//小B同学做了一个很好的算法 旧教室1.5倍扩容
int newCapacity = oldCapacity + (oldCapacity >> 1); //1.5倍
//若按照这个很好的算法扩容后 所需的空间还不够 直接利用minCapacity
if(newCapacity - minCapacity < 0){
newCapacity = minCapacity;//蒋老师提供的赋值给newCapacity
}
//经过计算 最终获得一个合理长度
//按照新的长度 创建一个新的教师 旧教室的椅子全部搬到新教师
elementDate = this.copyOf(elementDate,newCapacity); //小C同学做完事情之后得到新教师
}
//小C同学 设计一个方法 负责创建一个新数组
//将旧数组元素全部移入新数组内
// 需要新数组长度 旧数组数据
// 告知新数组的位置--返回新数组
private int[] copyOf(int[] oldArray,int newCapacity){
//创建一个新的数组(新的小教室)
int[] newArray = new int[newCapacity];
//将旧数组元素全部移入新数组内
for(int i=0;i<oldArray.length;i++){
newArray[i] = oldArray[i];
}
//将新数组返回
return newArray;
}
//设计方法 index是否合法 小D同学
// 提供--index
private void rangeCheck(int index){
if(index < 0 || index >= size){
System.out.println("index超过范围");
}
}
//---------------------------------------------------
//设计一个方法 获元素
// 提供获取元素位置
// 返回获取位置上元素
public int get(int index){
//检测index是否合法
this.rangeCheck(index);//找小D同学来帮忙检测
//如果上面一行代码可以走过去 证明index合法
return elementDate[index];
}
//设计一个方法 添加元素
// 需要的条件(参数) 返回一个结果(返回值)
// 需要提供一把椅子 告知用户一个结果 是否存储成功boolean
public boolean add(int element){
//确保我自己属性数组的内部容量
this.ensureCapecityInternal(size + 1);
//如果上面这一行代码可以执行完毕 elementDate的教室肯定有空间
//我想把element存入elementDate里n有效的元素个数记录一个
elementDate[size++] = element;
//告知用户 存储成功
return true;//存储成功
}
//设计一个方法删除元素
// 提供--元素位置
// 返回--删除的那个元素
public int remove(int index){
//检测index范围
this.rangeCheck(index);
//如果这行代码可以执行过去 没有异常 index合法
//将旧值index位置的旧值保存起来
int oldValue = elementDate[index];
//10 20 30 40 50 60 --->有效元素
//30 删掉 box.remove(2)
//10 20 40 50 60 0 --->size 5个
for(int i=index;i<size-1;i++){//i==2 4
elementDate[i] = elementDate[i+1]; //从index开始 至size-1 为止将后面元素依次前移覆盖
}//10 20 40 50 60 60 0 0 0 0
elementDate[--size] = 0;
//将旧值返回给用户
return oldValue;
}
public int size(){
return this.size;
}
}
public class Test {
public static void main(String[] args){
//相当于是用户(你们)
//想要存储元素-->第一个是数组[] 第二个是ArrayBox
//1.创建一个box对象
ArrayBox box = new ArrayBox(); //存储以后长度还能改变
//2.认识那个box干活 存储一个元素(int-->小椅子)
for(int i=1;i<=11;i++){
box.add(i*10);
}// 10 20 30 40 50 60
System.out.println("有效元素个数:" + box.size());//6
System.out.println("真实数组长度:" + box.elementDate.length);//10
//3.获取全部元素
for(int i=0;i < box.size();i++){
int value = box.get(i);
System.out.print(value+" ");// 10 20 30 40 50 60
}
System.out.println();
//4.删除2号索引的位置
int removeValue = box.remove(2);
System.out.println(removeValue);//30
System.out.println(box.size());//5
for(int i=0;i < box.size();i++){
int value = box.get(i);
System.out.print(value+" ");// 10 20 40 50 60
}
}
}
"C:\Program Files (x86)\Java\jdk1.7.0_71\bin\java.exe" ...
有效元素个数:11
真实数组长度:15
10 20 30 40 50 60 70 80 90 100 110
30
10
10 20 40 50 60 70 80 90 100 110
Process finished with exit code 0