package com.coding.basic.stack;
import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException;
public class ArrayList implements List{
public static final int defLen = 10;
private Object[] elements;
private int size;
private int maxLen;
public ArrayList(){
size = 0;
maxLen = defLen;
elements = new Object[defLen];
}
/**
* 在ArrayList末尾处追加元素
* @param o 添加的元素
*/
public void add(Object o){
if(size >= maxLen){
grow();
}
elements[size] = o;
size++;
}
/**
* 数组扩容
*/
private void grow(){
maxLen = maxLen + (maxLen >> 1);
Object[] newArr = new Object[maxLen];
System.arraycopy(elements, 0, newArr, 0, size);
elements = newArr;
}
/**
* 在指定索引处添加元素
* @param i 指定索引
* @param o 添加元素
*/
public void add(int i,Object o){
//判断插入位置大于数组实际长度
if(i > size){
size = i;
if(size >= maxLen){//数组大小大于数组最大容量则需要扩容
grow();
}
}
//插入位置不大于数组实际长度时,将插入位置的元素向后移。
for (int j = size; j > i ; j++) {
elements[j] = elements[j-1];
}
elements[i] = o;
size++;
}
/**
* 获取传入索引的元素
* @param index 索引
* @return 返回传入索引的元素
*/
public Object get(int index){
//索引不在实际范围内
if(index < 0||index >= size){
throw new ArrayIndexOutOfBoundsException();
}
for (int i = 0; i < size; i++) {
return elements[index];
}
return null;
}
/**
* 删除指定索引元素并返回
* @param index
* @return 该索引处元素
*/
public Object remove(int index){
//索引不在实际范围内
if(index < 0||index >= size){
throw new ArrayIndexOutOfBoundsException();
}else{
for (int j = index; j < size-1; j++) {
elements[j]=elements[j+1];
}
size--;
return elements[index];
}
}
/**
* 获取大小
* @return
*/
public int size(){
return size;
}
public Iterator iterator(){
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator{
int cursor;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
int i = cursor;
if(i >= size){
throw new NoSuchElementException();
}
if (i >= elements.length){
throw new ConcurrentModificationException();
}
cursor = i+1;
return elements[i];
}
}
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(6, 6);
list.remove(3);
for (int i = 0; i < list.size(); i++) {
System.out.println(i+":"+list.get(i));
}
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}