一、设计容器的需求:
1.该容器可以添加添加如何数
2.可以动态获取容器存储数据的个数
3.如果打印容器对象的时候,不打印地址,而是打印具体值
4.可以根据索引修改数据
5.可以根据索引查询数据
6.可以根据索引删除数据
7.支持半自动扩容
8.支持全自动扩容
二、容器类设计
import java.util.Arrays;
public class Container {
//定义一个数组 默认容量为10个数
private Object[] arr = new Object[10];
//定义数组下标
private int index;
/**
* 调用无参构造方法
* 容量默认为10个
*/
public Container() {
this(10);
}
/**
* 调用有参构造方法
* @param len 数据长度
*
* 半自动扩容方法
*/
public Container(int len) {
this.arr = new Object[len];
}
/**
* 添加内容的方法
* @param a 添加的值
*
* 全自动扩容方法
*/
public void add(Object a){
//如果存储个数大于或者等于数据存储的容量
if(size()>=arr.length){
//将容量扩到2倍
Object[] dest = new Object[size()*2];
//将源数组里面的值复制到新数组中
System.arraycopy(arr, 0, dest, 0, size());
//把dest的地址值给到arr
arr = dest;
}
//对应的下标赋值
arr[index] = a;
//添加一个值 下标加1
index++;
}
/**
* 获取数据个数
* @return 返回数据个数
*/
public int size(){
//返回数据个数
return index;
}
/**
* 重写toString方法
*/
@Override
public String toString() {
//创建一个新数组,长度为源数组数据个数
Object[] dest = new Object[size()];
//将源数组的值复制到新数组
System.arraycopy(arr, 0, dest, 0, size());
//返回打印
return Arrays.toString(dest);
}
/**
* 修改数据
* @param index 修改位置
* @param a 修改值
* @throws IndexOutOfBoundsException 如果索引为负数或者超过最大索引就抛出此异常
*/
public void revise(int index,Object a)throws IndexOutOfBoundsException{
//判断传入的索引值是否超出范围
if(index < 0 || index >= size()){
//如果超出范围就抛出自定义异常
throw new IndexOutOfBoundsException("可以修改数据的索引范围是:[0,"+(size()-1)+"]");
}
arr[index] = a;
}
/**
* 查询数据
* @param index 查询索引
* @return 返回查询值
* @throws IndexOutOfBoundsException 如果索引为负数或者超过最大索引就抛出此异常
*/
public Object query(int index)throws IndexOutOfBoundsException{
//判断传入的索引值是否超出范围
if(index < 0 || index >= size()){
//如果超出范围就抛出自定义异常
throw new IndexOutOfBoundsException("可以查询数据的索引范围是:[0,"+(size()-1)+"]");
}
//返回值
return arr[index];
}
public void delete(int index)throws IndexOutOfBoundsException{
//判断传入的索引值是否超出范围
if(index < 0 || index >= size()){
//如果超出范围就抛出自定义异常
throw new IndexOutOfBoundsException("可以删除数据的索引范围是:[0,"+(size()-1)+"]");
}
//将数组的值向前移动
System.arraycopy(arr, index+1, arr, index, size()-index-1);
//最后以为变为初始值
arr[size()-1] = 0;
//删除数据后,长度减1
this.index--;
}
}
三、测试类
/**
* 测试
*/
public class ContainerTest {
public static void main(String[] args) {
Container a = new Container();
a.add(1); //当容量不够时,会自动扩容
a.add("雨下一夜");
a.add('A');
a.add('a');
a.add(466);
a.add(true);
a.add(798734L);
a.add(12.35f);
a.add(new Object());
a.add("点点关注!!!");
//打印容量的所有值
System.out.println(a);
//修改数据
a.revise(5, 3);
System.out.println("修改数据后:"+a);
//查询数据
System.out.println("查询到的值:"+a.query(2));
//删除数据
a.delete(0);
System.out.println("删除数据后:"+a);
//打印存储数据个数
System.out.println("存储数据个数:"+a.size());
}
}
四、效果展示