package firstHomeWork.util;
import java.util.NoSuchElementException;
/**
* @Description: 基于数组的列表
* @author: leijing
* @date: 2017年2月21日 下午9:03:17
* @param <E>
*/
public class ArrayList<E> implements List<E> {
private static int initialCapacity = 10 ;//数组默认初始容量
Object[] elements;//元素的数组
private int size;//元素的个数
public ArrayList(){
this(initialCapacity);
}
public ArrayList(int capacity){
elements = new Object[capacity];
}
private void ensureCapacity(int minCapacity){
if(minCapacity > 0){
}
}
@Override
public boolean add(E e) {
ensureCapacity(size + 1);
elements[size++] = e;
return true;
}
@Override
public E remove(int index) {
rangeCheck(index);
E oldElement = (E) elements[index];
//将其后的元素前移
int needMovedNum = size - index - 1;
move(elements, index+1, elements,index, needMovedNum);
size--;
return oldElement;
}
/**
* @Description: 移动数组中的元素
* @param src 原数组
* @param from 复制元素起始下标
* @param dest 目标元素数组
* @param num 要复制的元素个数
* @return: void
* @author: leijing
* @date: 2017年2月22日 下午7:54:08
*/
private void move(Object[] src , int srcPosition , Object[] dest , int destPosition, int num){
for(int i = 0 ; i < num ; i ++){
dest[destPosition++] = src[srcPosition++];
}
}
/**
* @Description: 检查下标是否正确,如果越界抛出异常
* @param index
* @return: void
* @author: leijing
* @date: 2017年2月22日 下午7:52:59
*/
private void rangeCheck(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException();
}
}
@Override
public boolean remove(Object o) {
if(o == null){
for (int index = 0; index < size; index++) {
if(elements[index] == null){
remove(index);
return true;
}
}
}else{
for (int index = 0; index < size; index++) {
if(o.equals(elements[index])){
remove(index);
return true;
}
}
}
return false;
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public E get(int index) {
rangeCheck(index);
return (E) elements[index];
}
@Override
public E set(int index, E e) {
rangeCheck(index);
E oldElement = (E) elements[index];
elements[index] = e;
return oldElement;
}
@Override
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
private int indexOf(Object o){
if(o == null){
for (int index = 0; index < size; index++) {
if(elements[index] == null){
return index;
}
}
}else{
for (int index = 0; index < size; index++) {
if(o.equals(elements[index])){
return index;
}
}
}
return -1;
}
@Override
public void clear() {
for (int index = 0; index < size; index++) {
elements[index] = null;
}
size = 0;
}
@Override
public Iterator<E> iterator() {
return new ArraylistIterator();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int index = 0; index < size; index++) {
if(index == size -1){
sb.append(elements[index]);
}else{
sb.append(elements[index]).append(",");
}
}
return sb.toString();
}
private class ArraylistIterator implements Iterator<E>{
private int position;
@Override
public boolean hasNext() {
return position != size;
}
@Override
public E next() {
Object[] elements = ArrayList.this.elements;
int i = position;
if(i >= size){
throw new NoSuchElementException();
}
position = i + 1;
return (E) elements[i+1];
}
@Override
public void remove() {
if(position > size){
throw new NoSuchElementException();
}
ArrayList.this.remove(position);
}
}
}