自定义ArrayList的实现

使用数组来实现自定义ArrayList,除了基本的增删查改等方法之外,还添加了API中所使用到的一些方法,方便大家更好的理解ArrayList的实现,具体实现都有解释,主函数中给出了测试方法,代码如下:

/**
 * 自定义泛型列表
 * @author 陈强
 * @param <E>
 */
public class MyArrayList<E> {
	Object[] data=new Object[0];//初始数组,定义一个对象类型的数组保存数据
	public static void main(String args[]){
		//创建Integer类型的数组列表
		MyArrayList<Integer> my=new MyArrayList<Integer>();
		//添加元素
		for(int i=1;i<=5;i++){
			my.add(i);
		}
		//my.removeFromTo(1, 3);
		my.add(1);
		//my.turnArray();
		//System.out.println("首次出现指定元素的位置是"+my.IndexOf(1));
		System.out.println("最后一次出现指定元素的位置是"+my.LastIndexOf(1));
		System.out.println("队列当前的长度是"+my.size());
		my.print();
		//System.out.println("获取的元素"+my.get(1));
	}
	/**
	 * 打印队列元素的方法
	 */
	public void print(){
		int length=data.length;
		for(int i=0;i<length;i++){
			System.out.print(data[i]+" ");
		}
	}
	/**
	 *	添加元素的方法
	 * @param e
	 */
	public void add(E e){
		int length=data.length;//获取当前数组的长度
		Object[] dest=new Object[length+1];//创建一个新数组
		//先将原数组中的元素都复制过来
		for(int i=0;i<length;i++){
			dest[i]=data[i];
		}
		dest[length]=e;//添加新元素
		data=dest;//用新数组替换原来的数组
	}
	/**
	 * 插入元素的方法
	 * @param index 指定的下标
	 * @param e 插入的元素
	 */
	public void insert(int index,E e){
		int length=data.length;
		Object[] dest=new Object[length+1];
		for(int i=0;i<index;i++){//将索引前的元素先复制过来
			dest[i]=data[i];
		}
		dest[index]=e;//添加新元素到索引位置
		for(int j=index;j<length;j++){//再将后面一部分元素复制过来
			dest[j+1]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除元素的方法
	 * @param index 指定的下标
	 */
	@SuppressWarnings("unchecked")
	public E remove(int index){
		int length=data.length;
		Object[] dest=new Object[length-1];
		for(int i=0;i<index;i++){//将索引前的元素复制过来
			dest[i]=data[i];
		}
		for(int j=index+1;j<length;j++){//跳过索引指定的位置
			dest[j-1]=data[j];
		}
		data=dest;
		return (E)data[index];//得到被移除的元素
	}
	/**
	 * 移除所有元素的方法
	 */
	public void removeAll(){
		Object dest[]=new Object[0];
		data=dest;
	}
	/**
	 * 获取队列的长度
	 */
	public int size(){
		return data.length;
	}
	/**
	 * 获取指定下标的元素
	 */
	@SuppressWarnings("unchecked")
	public E get(int index){
		return (E) data[index];
	}
	/**
	 * 判断队列是否为空
	 */
	public boolean isEmpty(){
		return size()==0;
	}
	/**
	 * 改变指定下标位置的元素的方法
	 * @param index
	 * @param e
	 */
	public void set(int index,E e){
		//方法类似插入的方法
		int length=data.length;
		Object[] dest=new Object[length];
		for(int i=0;i<index;i++){
			dest[i]=data[i];
		}
		dest[index]=e;//改变指定位置的元素
		for(int j=index+1;j<length;j++){
			dest[j]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除从某一个下标位置开始到某一个下标位置结束的中间元素
	 * @param start 开始位置的下标
	 * @param end	结束位置的下标
	 */
	public void removeFromTo(int start,int end){
		int length=data.length;
		Object dest[]=new Object[length-(end-start)-1];
		for(int i=0;i<start;i++){
			dest[i]=data[i];
		}
		for(int j=end+1;j<length;j++){
			dest[j-(end-start)-1]=data[j];
		}
		data=dest;
	}
	/**
	 * 将列表翻转
	 */
	public void turnArray(){
		int length=data.length;
		int j=length-1;
		Object temp;
		for(int i=0;i<length/2;i++){
			temp=data[j];
			data[j]=data[i];
			data[i]=temp;
			j--;
		}
	}
	/**
	 * 搜索列表中首次出现指定元素的位置,如果不存在该元素则返回-1
	 * @param obj
	 */
	public int IndexOf(Object obj){
		int length=data.length;
		for(int i=0;i<length;i++){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
	/**
	 * 搜索列表中最后一个出现指定元素的位置,如果不存在则返回-1
	 * @param obj 指定元素
	 */
	public int LastIndexOf(Object obj){
		int length=data.length;
		for(int i=length-1;i>=0;i--){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值