设计类(替代数组可以做的事情)

	//你们是使用者(用户)  我是ArrayBox类型的一个具体的对象
	//你们要存储椅子				我们把椅子直接交给我box
	//以前直接找到数组那个人		我就可以帮你们存起来
	//存储的时候你们自己找位置	至于我爸椅子存在哪里  长度够不够  都不用你们管
	//如果数组存满啦自己想办法

public class ArrayBox<E>{//泛型
	//描述事物
	//属性
	//一间小教室
	private static final int  DEFAULT_CAPACITY=10;
	private Object[] elementData;//长度一旦确定不能再次发生改变//int[]
	private int  size=0;//记录教室中有效的元素个数
	
	public ArrayBox(){
		elementData=new Object[DEFAULT_CAPACITY];//int[]
	}
	public ArrayBox(int capacity){
		elementData=new Object[capacity];//int[]
	}

	//方法
	//设计方法  帮忙判断给定index范围是否合法  小D同学
	//  需要提供一个index
	private  void  rangeCheck(int index){
		if( index<0 || index>=size){
			//参考数组的操作  自己定义一个异常(自己创建的类)来说明这个问题
			throw new BoxIndexOutOfBoundsException("Index:"+index+",Size:"+size);
		}
	}
	//设计方法  帮我自己做事的  A小弟
	//  需要提供一个条件   老师需要的最小容量
	//  没有返回值
	private void  ensureCapacityInternal(int minCapacity){
		if(minCapacity - this.elementData.length>0){
			//证明老师需要的最小容量 比原来教室的容量还要大  存不下啦
			//扩容--->小B同学
			this.grow(minCapacity);
		}
	}
	//设计方法  帮助教师扩容(新教室)小B同学---数学很好但倔强的天长
	//   需要提供一个条件   老师需要的最小容量
	private void grow(int minCapacity){
		//获取旧教室的长度
		int oldCapacity= elementData.length;
		//小B同学做了一个觉得很好的算法  旧教室1.5倍扩容
		int newCapacity = oldCapacity +(oldCapacity  >> 1);
		//若按照这个很好的算法扩容后  所需要的空间还不够  直接利用minCapacity
		if(newCapacity- minCapacity<0){
			newCapacity=minCapacity;//将老师提供的赋值给newCapacity
		}
		//经过一通计算  最终获取到一个合理的长度 newCapacity
		//按照这个新的长度  创建一个新的教室  旧教室的椅子全部搬入到新教室中
		elementData = this.copyOf(elementData,newCapacity);//小C同学做完事情之后  得到一个新教室
	}
	
	//小C同学--->  设计一个方法  负责创建一个新数组
	//将旧数组的元素全部移入新数组内  干体力活的
	//   需要新数组的长度  需要提供旧数据
	//  需要告知新数组的位置-----返回新数组
	private Object[] copyOf(Object[]  oldArray,int newCapacity){//int[]   
		//创建一个新的数组(新的小教室)
		Object[]  newArray=new  Object[newCapacity];//int[]
		//将旧数组元素全部移入新数组内
		for(int i=0;i<oldArray.length;i++){
			newArray[i]=oldArray[i];
		}
		//将新数组返回
		return newArray;	
	}
//====================================================================================	
	//方法  需要一个方法  用来添加元素
	// 提供什么条件(参数)  返回一个结果(返回值)
	//  需要提供一把椅子int   告知用户一个结果   是否存储成功  boolean
	public boolean add(E element){//int 创建box对象时  规定的类型
		//确保我自己的属性数组的内部容量
		this.ensureCapacityInternal(size+1);
		//如果上面的这一行代码可以执行完毕   elementData的教室肯定有空间
		//我想把element存入elementData里    有效元素个数多记录一个
		elementData[size++] = element;
		//告诉用户  存储成功
		return true;//表示成功
	}
	//设计一个方法  用来获取元素
	//   提供什么条件(参数)  返回结果(返回值)
	//  提供获取元素的位置   获取位置上的那个元素(int---小椅子)
	public E  get(int index){//int
		//检测index范围是否合法
		this.rangeCheck(index);//找到小D同学来帮忙检测
		//如果上面一行代码可以走过去  证明index是合法
		return (E)elementData[index];//E
	}
	//需要设计一个方法  用来删除元素
	//提供元素的位置  返回值---删除掉的那个元素
	public E remove(int index){//int
		//检测index范围
		this.rangeCheck(index);
		//如果这行代码可以执行过去  没有异常  index合法
		//将index位置的旧值保存起来
		E oldValue=(E)elementData[index];//int 
		//10  20  30  40  50  60  0  0   0  0--->有效元素
		//30数字删掉   box.remove(2);
		//10  20  40 50  60  0  0   0   0  0--->size  5个
		for(int i=index;i<size-1;i++){
			elementData[i]= elementData[i+1];//从index开始  至size-1为止  将后面位置元素依次前移覆盖
		}//10  20   40  50  60  0  0   0   0
		elementData[--size]=null;//0将末尾元素清空
		//将就数组返回给用户
		return oldValue;
	}
	
	public int size(){
		return this.size;
	}
}


public class  BoxIndexOutOfBoundsException  extends RuntimeException{
	//想要描述这个类是一个(我们自己的异常 is  a  异常)异常
	//继承extends  泛化   (实现)implement
	
	public BoxIndexOutOfBoundsException(){	}
	public BoxIndexOutOfBoundsException(String msg){
		super(msg);//msg提供给父类
	}
	
}

public class Test{
	public static void main(String[] args){
		//相当于是用户(你们)
		//想要存储元素----->  第一个是疏忽组[]  第二个是ArrayBox
		//1.创建一个box对象
		ArrayBox<Integer> box=new ArrayBox<Integer>(6);//存储以后长度还能改变
		//2.让box干活去 存储一个元素(int---小椅子)
		for(int i=1;i<=5;i++){
			box.add(i*10);
		}
//		System.out.println("有效元素个数:"+box.size);//11个
//		System.out.println("真实数组长度:"+box.elementData.length);//15 个
		//3.获取第全部元素
		for(int i=0;i<box.size();i++){
			int value=box.get(i);
			System.out.println(value+"   ");
		}
		//4.删除2号索引位置的元素
		int removeValue =box.remove(2);
		System.out.println(removeValue);
		System.out.println(box.size());
		for(int i=0;i<box.size();i++){
			int value=box.get(i);
			System.out.print(value+"  ");//10  20  40  50  60
		}
		
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值