创建一个自己的数组
首先明确我们的数组都有什么功能
功能:
1.插入:向索引位置插入一个元素,后面的元素往后平移,由此还可以引申出头部添加元素,尾部添加元素两个功能
2.删除:删除某个索引的元素,并把后面的元素整体前移,由此还可以引申出删除头部元素,删除尾部元素
3.获取:获取数组实际长度,获取数组容量,获取数组索引对应的值,获取由值对应的索引
4.判断:判断数组是否为空,判断是否含有某个元素
5.修改:修改索引位置的值
6.toString:重写toString方法,把数组中的元素转换成String类型便于显示出
7.resize():重新为数组设置容积
为什么要重新设置容积呢?是为了处理当数组已满或者数组有太多空闲容量的情况。当数组已满时,由于我们不知道用户还要添加多少个数组,把容积设置成+1,+n都不合适,所以我们要给他添加到原先容积的2倍。当数组删除元素后有太多空闲容量时,我们需要让数组容积变成原先的1/4,因为如果变成1/2的话,万一用户刚删除完一个又添加一个元素,然后又删除一个又添加一个元素的话,这样子就需要一会变一下容积一会变一下容积,这样子变容积很繁琐,所以变成原先的1/4更合适点。
泛型:
我们的数组不仅是能存放int类型,当传参传入什么类型时,就应该保存什么类型,所以我们需要用到泛型
public class MyArrary<T> { private T[] value; //保存数据 int size; //实际存放个数 int capacity; //容积 // 构造方法 public MyArrary(int capacity){ if(capacity<=0){ this.capacity=10; }else { this.capacity=capacity; } this.size=0; this.value=(T[])(new Object[this.capacity]); //不可以直接new一个T[]类型,所以需要先new一个Object[]类型然后转为T[] } //获取实际长度 public int getSize() { return this.size; } //获取数组的容积 public int getCapacity() { return this.capacity; } //判断数组是否为空 public boolean ifnull(){ return this.size==0; } //向数组中添加元素 //this.size是指向待插入元素的索引 public void adddata(T data){ insert(this.size,data); } //修改指定位置的值 public void modify(int index,T data){ if(index<0||index>capacity){ throw new IllegalArgumentException("index is invalid."); } this.value[index]=data; } //插入元素 public void insert(int index,T data){ if(index<0||index>this.capacity){ throw new IllegalArgumentException("index is invalid."); } if(this.size==this.capacity){ //如果数组满了就重新设置容积 resize(2*this.capacity); } for(int i=this.size;i>index;i--){ //从末尾size开始往回遍历,第i个等于i-1个 this.value[i]=this.value[i-1]; } this.size++; this.value[index]=data; } //删除索引位置元素 public void delete(int index){ if(index<0||index>this.capacity){ throw new IllegalArgumentException("index is invalid."); } if(this.size<=this.capacity/4){ //如果数组的实际长度比容积的1/4还小说明浪费了太多空间需要重新设置容积 resize(this.capacity/2); } for(int i=index;i<this.size-1;i++){ //从索引开始第i个等于i+1个 this.value[i]=this.value[i+1]; } this.size--; } //获取索引位置的值 public T getindexdata(int index){ if(index<0||index>this.capacity){ throw new IllegalArgumentException("index is invalid."); } return this.value[index]; } //根据值获取索引 public int getindex(T data){ for (int i = 0; i < this.size; i++) { if(data==this.value[i]){ return i; } } return -1; } //向头部添加元素 public void inserttop(T data){ insert(0,data); } @Override public String toString() { StringBuilder s=new StringBuilder(); //需要用到StringBuilder的append来添加'[',']',',' s.append("["); for (int i = 0; i < this.size; i++) { s.append(this.value[i]); if(i!=this.size-1) { s.append(","); } } s.append("]"); String string=s.toString(); //把StringBuilder转换成String return string; } //是否包含某元素 public boolean contain(T data){ for (int i = 0; i < this.size; i++) { if(data==this.value[i]){ return true; } } return false; } //重新给容积 private void resize(int newcapacity){ //由于数组的容积都是不变的所以需要新建一个数组 T [] newvalue=(T[])(new Object[newcapacity]); //转移数组 for (int i = 0; i < this.size; i++) { newvalue[i]=this.value[i]; } //改变容器,数组 this.value=newvalue; this.capacity=newcapacity; } }