package com.pxshuo.se01.basic.impl;
import com.pxshuo.se01.basic.Iterator;
import com.pxshuo.se01.basic.List;
/**
* 实现一个ArrayList
* @author Pxshuo
*
*/
public class ArrayList implements List{
private int size = -1;//数组的长度的下标
private Object[] elements = new Object[10];//数组内容
private int addSize = 10;//每次增加的长度
@Override
public void add(Object o) {
elements = grow();
size++;
elements[size] = o;//size与index同一个概念
}
@Override
public void add(int index, Object o) {
if (index > size + 1) {
return;
}
elements = grow();
int moveNum = size - index + 1;//本次操作需要移动的元素的个数;
size++;
if (index >= elements.length - 1) {//按照位置来看
elements = grow(elements, index - (elements.length - 1));
size = index;//size与index同一个概念
}
/**
* 整体向后移一位
*/
if(moveNum > 0){
System.arraycopy(elements, index, elements, index + 1, moveNum);
}
// for(int i = size - 1; i >= index; i--)
// {
// elements[i] = elements[i-1];
// }
elements[index] = o;
}
@Override
public Object get(int index) {
return elements[index];
}
@Override
public Object remove(int index) {
if (index > size) {
return null;
}
Object removeEle = elements[index];
int moveNum = size - index;//本次操作需要移动的元素的个数;
if (moveNum > 0) {
System.arraycopy(elements, index + 1, elements, index, size - index + 1);
}
elements[size] = null;
size--;
return removeEle;
}
@Override
public int size() {
return size + 1;
}
/**
* 设置迭代器
* @return
*/
public Iterator iterator() {
return new ArrayListIterator(this);
}
private class ArrayListIterator implements Iterator{
ArrayList arrayList = null;
int position = -1;
public ArrayListIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
@Override
public boolean hasNext() {
position ++;
if (position >= arrayList.size()) {
return false;
}
return true;
}
@Override
public Object next() {
return arrayList.elements[position];
}
}
/**
* 自动控制是否增加数组长度
* @return 如果增加一条数据会造成数组溢出,则增加数组的长度,否则不进行改变。
*/
private Object[] grow(){
if (size() >= elements.length) {
return grow(elements, addSize);
}
else {
return elements;
}
}
/**
* 动态增加数组长度
* @param src
* @param addSize
* @return
*/
private Object[] grow(Object[] src,int addSize){
Object[] target = new Object[src.length + addSize];
System.arraycopy(src, 0, target, 0, src.length);
return target;
//return Arrays.copyOf(src, src.length + addSize);同理
}
}