JAVA数据结构ArrayList实现

package p01.动态数组;

public interface List<E> {
	public int getSize();			//获取列表中元素的个数
	public boolean isEmpty();		//判断当前列表是否为空
	public void add(int index, E e);//在列表中指定角标index处,添加元素e
	public void addFrist(E e);		//在列表第一个位置添加e
	public void addLast(E e);		//在列表最后一个位置添加e
	public E get(int index);		//获取index角标位置的元素
	public E getFrist();			//获取列表中第一个元素
	public E getLast();				//获取列表中最后一个元素
	public E remove(int index);		//删除index处的元素并返回元素
	public E removeFrist();			//删除列表中的第一个元素,并返回
	public E removeLast();			//删除列表中的最后一个元素,并返回
	public void set(int index,E e);	//修改index处的元素为e
	public boolean contains(E e);	//判断列表是否包含e
	public int find(E e);			//在列表中查找指定元素e的角标
	public void removeElement(E e);	//在列表中删除指定元素e
	public void clear();
}

package p01.动态数组;

//动态数组实现的链表->顺序表
/*List
 * --ArrayList
 * 增删O(n) 改查O(1)
 */
public class ArrayList<E> implements List<E> {
	private E[] data;	//容器-存储元素 data.length 最大容量
	private int size;	//当前列表中元素的个数   有效长度
	private static final int DEFAULT_CAPACITY=10;
	public ArrayList(){	//默认构造函数创建一个容量为10的列表
		this(DEFAULT_CAPACITY);
	}
	public ArrayList(int capacity){//构造函数中创建一个容量为capacity的列表
		if(capacity<0){
			capacity=DEFAULT_CAPACITY;
		}
		this.data=(E[]) new Object[DEFAULT_CAPACITY];
		this.size=0;
	}
	//O(n)
	@Override
	public void add(int index,E e){
		if(index<0||index>size){
			throw new IllegalArgumentException("角标越界");
		}
		if(size==data.length){
			resize(data.length*2); //重置容量
		}
		for(int i=size;i>index;i--){
			data[i]=data[i-1];
		}
		data[index]=e;
		size++;
	}
	//O(n)
	@Override
	public void addFrist(E e) {
		add(0, e);
		
	}
	//O(1)
	@Override
	public void addLast(E e) {
		add(size,e);
	}
	//O(n)
		@Override
		public E remove(int index) {
			if(index<0||index>=size){
				throw new IllegalArgumentException("角标越界");
			}
			E res=data[index];
			for(int i=index;i<size-1;i++){
				data[i]=data[i+1];
			}
			size--;
			if(size==data.length/4 && data.length>DEFAULT_CAPACITY){
				resize(data.length/2);
			}
			return res;
		}
	//O(n)
	@Override
	public E removeFrist() {
		return remove(0);
	}
	//O(1)
	@Override
	public E removeLast() {
		return remove(size-1);
	}
	@Override
	public void removeElement(E e) {
		int index=find(e);//O(n)
		if(index!=-1){
			remove(index);//O(n)
		}
	}
	
	//O(n)
	private void resize(int newLen) {
		E[] newData=(E[]) new Object[newLen];
		for(int i=0;i<Math.min(data.length, newData.length);i++){
			newData[i]=data[i];
		}
		data=newData;
	}
	//O(1)
	@Override
	public int getSize() {
		return this.size;
	}
	//O(1)
	@Override
	public boolean isEmpty() {
		return this.size==0;
	}
	//O(1)
	@Override
	public E get(int index) {
		if(index<0||index>=data.length){
			throw new IllegalArgumentException("index is out of data!");
		}
		return data[index];
	}
	@Override
	public E getFrist() {
		// TODO 自动生成的方法存根
		return get(0);
	}
	@Override
	public E getLast() {
		// TODO 自动生成的方法存根
		return get(size-1);
	}
	//O(1)
	@Override
	public void set(int index, E e) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("index is out of data!");
		}
		data[index]=e;
	}
	//O(n)
	@Override
	public int find(E e) {
		for (int i = 0; i < size; i++) {
			if(data[i]==e){
				return i;
			}
		}
		return -1;
	}
	@Override
	public boolean contains(E e) {
		// TODO 自动生成的方法存根
		return find(e)!=-1;
	}
	public int getCapacity(){
		return data.length;
	}
	@Override
	public void clear() {
		this.data=(E[]) new Object[DEFAULT_CAPACITY];
		this.size=0;
	}
	public void swap(int i,int j){
		if(i<0||i>=size||j<0||j>=size){
			throw new IllegalArgumentException("角标非法");
		}
		E temp=data[i];
		data[i]=data[j];
		data[j]=temp;
	}
	
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		if(isEmpty()){
			//ArrayList:[] 0/10
			sb.append(String.format("ArrayList:[] %d/%d\n", size,data.length));
		}else{
			sb.append("[");
			for(int i=0;i<size;i++){
				if(i==size-1){
					sb.append(data[i]+"]");
				}else{
					sb.append(data[i]+",");
				}
			}
			sb.append(String.format("ArrayList: %d/%d \n", size,data.length));
		}
		return sb.toString();
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值