动态数组实现

动态数组的封装

功能:实现数组的增、删、改、查、插等等功能
实现过程如下:

package DynamicArray;

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();
	}
    
}

测试

package DynamicArray;
public class ArrayTest {
public static void main(String[] args) {
	MyArray<Integer>arr=new MyArray();
	arr.addFirst(8);
	arr.addLast(10);
	arr.addFirst(7);
	arr.addFirst(3);
	arr.addLast(20);
	arr.addLast(6); //增
	  
	arr.add(1, 2); //增 >插
    arr.removeIndex(2);  //删 > 索引 
    arr.removeLast(); // 删 >尾部
//    arr.removFirst(); //删 >头部
    arr.set(1, 100);   //改
    
//    System.out.println("索引为:"+element);
    
    int index=arr.getIndex(10);
    System.out.println(index);
	System.out.println(arr.toString());
}
}

实现效果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金石不渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值