欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

普通数组的实现

程序员文章站 2022-09-20 12:14:38
普通数组的实现package ArrayStack;public class MyArray { private E []data; //1新键一个数组 private int size; //2 新键计数数组个数public MyArray(int size) {data=(E[])new Object[size];size=0;}public MyArray() { //3 初始化完成 this(10);}//...

普通数组的实现

package ArrayStack;

public class MyArray <E>{
    private E []data; //1新键一个数组
    private int size;  //2 新键计数数组个数
	public MyArray(int size) {
		data=(E[])new Object[size];
		size=0;
	}
	public MyArray() {  //3 初始化完成
	        this(10);
	}
	// 4添加方法>任意位置
	public void add(int index,E e) {
		//判断index 是否越界
		if(index>size||index<0) {
			throw new IllegalArgumentException("下标越界");
		}
		//判断是否需要阔容  >>等于最后一个元素
		if(size==data.length) {
			resize(data.length*2);
		}
		//腾出位置>>>size是先行指针,要退回一格
		for(int i=size-1;i>=index;i--) { // -1  i>=0  i--
			data[i+1]=data[i];
		}
		//在index的位置添加e,并维护size;
		data[index]=e;
		size++;  //size是先行的
	}

	// 5增加方法>尾部添加 
	public void addLast(E e) {
		//如果数组存放满了,无法继续添加
		add(size,e);

	} 
	//6 增加方法>在头部添加
	public void addFirst(E e) {
		add(0,e);
	}
	//6 删除方法 > 删除指定元素
	//7 删除 >>指定索引值
	public E removeIndex(int index) {
		// TODO Auto-generated method stub
		if(index>=size||index<0) {
		throw new IllegalArgumentException("remove faile,index is illegal");
		}
		//找出待删除元素并存储起来
		E res =data[index];
		for(int i=index;i<size;i++) {
			data[i]=data[i+1]; //往前挪一位进行 覆盖
		}
		//维护size ,因为元素数目减少一位
		size--;
		//懒得算法 缩容>>具有一定弹跳性
		if(size==data.length/4&&data.length!=1) {
			resize(data.length/2);
		}
		return res;
	}
	//8删> 尾部
	public  E removeLast() {
		return removeIndex(size-1);
	}
	//9 删 >头部
	public E removFirst() {
		return removeIndex(0);
	}
	//10查> 指定索引
	public int findIndex(int e) {
		// TODO Auto-generated method stub
		for(int i=0;i<size;i++) {
			if(data[i].equals(e)) {
				return i;
			}
		}
		return -1;
	}
	//11改> 
	public void set(int index ,E e) {
		//改元素之前先判断
		if(index>size||index<0) {
			throw new IllegalArgumentException("set fail,index is Illgal");
		}
		data[index]=e;
	}
	//12 查> 是否含有该元素
	public boolean contain(E e) {
		for(int i=0;i<size;i++) {
		 //值的比较
			if(data[i].equals(e)) {
				return true;
			}
		}
		return false;
	}
	//12 查 > 索引查元素
	public E getElement(int index) {
		//判断索引是否越界
		if(index>=size||index<0) {
		throw new IllegalArgumentException("get index fail,index is illegal");
		}
	      return data[index];
	}
	//13 查 >元素查索引
	public int getIndex(int i) {
		return findIndex(i);
	}
	//20 阔容 > 新键一个原先大小两倍数组空间,将原先数组元素一存放到新的数组里面取
	public void resize(int newcapacity) {
		// TODO Auto-generated method stub
		E []newdata=(E[])new Object[newcapacity];
		for(int i=0;i<size;i++) {
			newdata[i]=data[i];
		}
		data=newdata;
	}
	//21 实现栈 新增加的方法
	public E getLast() {  //拿到最后一个元素
		return getElement(size-1);
	}
	//22 拿到元素的个数
	public int getSize() {
		return size;
	}
	//23 判断队列是否为空
	public boolean isEmpty() {
		return size==0;
	}
	
	
    //重写toStriing
	@Override
	public String toString() {
		// TODO Auto-generated method stub
    StringBuffer res=new StringBuffer();
    res.append(String.format("Array:size=%d,capacity=%d\n", size,data.length));
     res.append("[");
     //遍历数组
     for(int i=0;i<size;i++) {
    	 if(i==size-1) {
    		 res.append(data[i]);
    	 }else {
    		 res.append(data[i]+",");
    	 }
     }
     res.append("]");
    return res.toString();
	}
    
}

本文地址:https://blog.csdn.net/weixin_45952706/article/details/110221244