自定义ArrayList

与ArrayList同名,注意导包问题,实现之前自定义的List接口

代码中方法皆有注释,注意查看

import java.util.Comparator;
import java.util.Iterator;

/**
 * 线性结构的顺序存储实现方式
 * */
public class ArrayList<E> implements List<E> {
    //存储元素的容器
    private E[] data;
    //元素的有效个数
    private int size;
    //默认容量大小
    private static int DEFAULT_CAPACITY = 10;

    /**
     * 创建一个默认容量为10的线性表
     * */
    public ArrayList() {
    	
        this(DEFAULT_CAPACITY);
    }
    /**
     * 创建一个容量为指定值capacity的线性表
     * */
    public ArrayList(int capacity) {
    	
        if (capacity <= 0) {
        	
            throw new IllegalArgumentException("initial capacity must > 0");
        }
        
        data = (E[]) new Object[capacity];
        size = 0;
    }
    /**
     * 将一个现有的数组封装成一个线性表
     * */
    public ArrayList(E[] arr) {
    	
        if (arr == null) {
        	
            throw new IllegalArgumentException("initial arr can not be null");
        }
        
        data = (E[]) new Object[arr.length];
        size = 0;
        for (E e : arr) {
            add(e);
        }
    }

    @Override
    public void add(E element) {
    	
        add(size,element);
    }

    @Override
    public void add(int index, E element) {
    	
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("add index must 0 <= index <= size");
        }
        //是否满了
        if (size == data.length) {
            //扩容
            resize(data.length * 2);
        }
        for (int i = size; i > index; i--) {
            data[i] = data[i - 1];
        }
        data[index] = element;
        size++;
    }

    private void resize(int newLength) {
    	
        E[] newData = (E[]) new Object[newLength];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        data = newData;
    }

    @Override
    public void remove(E element) {
    	
        int index = 0;
        
        while ((index = indexOf(element)) != -1) {
            remove(index);
        }
    }

    @Override
    public E remove(int index) {
    	
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("remove index must 0 <= index < size");
        }
        E ret = data[index];
        for (int i = index ; i <= size - 2; i++) {
            data[i] = data[i + 1];
        }
        size--;
        if (size == data.length / 4 && data.length > DEFAULT_CAPACITY) {
            resize(data.length / 2);
        }
        return ret;
    }

    @Override
    public E get(int index) {
    	
        if (index < 0 || index >= size) {
        	
            throw new IllegalArgumentException("get index outof range");
        }
        return data[index];
    }

    @Override
    public E set(int index, E element) {
    	
        if (index < 0 || index >= size) {
        	
            throw new IllegalArgumentException("get index outof range");
        }
        E ret = data[index];
        data[index] = element;
        return ret;
    }

    @Override
    public int size() {
    	
        return size;
    }

    @Override
    public int indexOf(E element) {
    	
        for (int i = 0; i < size; i++) {
        	
            if (data[i].equals(element)) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public boolean contains(E element) {
    	
        return indexOf(element) != -1;
    }

    @Override
    public boolean isEmpty() {
    	
        return size == 0;
    }

    @Override
    public void clear() {
    	
        data = (E[]) new Object[DEFAULT_CAPACITY];
        size = 0;
    }

    @Override
    public void sort(Comparator<E> comparator) {
    	//插入排序o(n*n)
    	if(comparator==null) {
    		
    		throw new IllegalArgumentException("comparator can not be null");
    	}
    	
    	for(int i=1;i<size;i++) {
    		
    		E e=data[i];
    		
    		int j;
    		
    		for( j=i;j>0&&comparator.compare(data[j-1], e)>0;j--) {
    			
    			data[j]=data[j-1];
    		}
    		
    		data[j]=e;
    	}
    	 

    }

    @Override
    public List<E> sublist(int fromIndex, int toIndex) {
    	
    	if(fromIndex<0||toIndex>size||fromIndex>toIndex) {
    		
    		throw new IllegalArgumentException("sublist index out range");
    	}
    	ArrayList<E> list =new ArrayList<>();
    	
    	for(int i=fromIndex;i<toIndex;i++) {
    		
    		list.add(data[i]);;
    	}
        return list;
    }

    @Override
    public String toString() {
    	
    	StringBuilder sb =new StringBuilder();
    	
    	sb.append('[');
    	
    	if(isEmpty()) {
    		
    		sb.append(']');
    		
    	}else {
    		
    		for(int i=0;i<size;i++) {
    			
    			sb.append(data[i]);
    			
    			if(i!=size-1) {
    				
    				sb.append(',');
    				
    			}else {
    				
    				sb.append(']');
    			}
    		}
    	}
    	
        return sb.toString();
    }

    @Override
    public boolean equals(Object obj) {
    	
    	if(obj==null) {
    		
    		return false;
    	}
    	if(obj==this) {
    		
    		return true;
    	}
    	if(obj instanceof ArrayList) {
    		
    		ArrayList<E > other =(ArrayList<E>) obj;
    		
    		if(this.size==other.size) {
    			
    			for(int i=0;i<size;i++) {
    				
    				if(!this.data[i].equals(other.data[i])) {
    					
    					return false;
    				}
    			}
    		}
    		
    	}else {
    		
    		return false;
    	}
        return false;
    }

    //返回迭代器对象
    @Override
    public Iterator<E> iterator() {
    	
    	
      return new ArrayListIterator();
    }
    
    private class ArrayListIterator implements Iterator<E>{
    	
    	
          int cur=0;

		@Override
		public boolean hasNext() {//判断是否有下一个元素
			
			return cur<size;
		}

		@Override
		public E next() {//取出当前元素并跳到下一个元素
			
			return data[cur++];
		}
    	
    }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个F啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值