package structure.week1;
import java.util.Collection;
import structure.week1.List;
public class ArrayList<E>{
private int size=0,offset=10;
private Object[] data = null;
public ArrayList(){
data = new Object[offset];
}
public ArrayList(int arg0){
if(arg0<0) arg0=0;
size = arg0;
data = new Object[size];
}
public void add(Object arg0) {
size += 1;
int leng = data.length;
if(size>leng){
Object[] newdata = new Object[size + offset];
for(int i=0;i<leng;i++){
newdata[i] = data[i];
}
data = newdata;
}
data[size-1] = arg0;
}
public void add(int arg0, E arg1) {
if( arg0>size || 0<arg0) return ;
size += 1;
int leng = data.length;
if(size>leng){
Object[] newdata = new Object[size + offset];
for(int i=0;i<leng;i++){
newdata[i] = data[i];
}
data = newdata;
}
for (int i=1;i<size-arg0;i++){
data[size-i] = data[size-i-1];
}
data[arg0] = arg1;
return ;
}
public boolean addAll(Collection<? extends E> arg0) {
if (arg0 == null) return false;
int leng = data.length,newobjnum = arg0.size(),lastsize=size;
size += newobjnum;
if(size>leng){
Object[] newdata = new Object[size + offset];
for(int i=0;i<leng;i++){
newdata[i] = data[i];
}
data = newdata;
}
int i=lastsize;
for(E e : arg0){
data[i] = e;
}
return true;
}
public boolean addAll(int arg0, Collection<? extends E> arg1) {
int newobjnum = arg1.size(),lastsize = size;
if(arg1 == null || arg0>size+1 || 0>arg0 || newobjnum==0) return false;
size += newobjnum;
int leng = data.length;
if(size>leng){
Object[] newdata = new Object[size + offset];
for(int i=0;i<leng;i++){
newdata[i] = data[i];
}
data = newdata;
}
for (int i=1;i<size-arg0;i++){
data[size-i] = data[size-i-newobjnum];
}
int i = arg0;
for (E e:arg1){
data[i] = e;
i += 1;
}
return true;
}
public void clear() {
size=0;
data = new Object[offset];
}
public boolean contains(Object arg0) {
for(Object e:data){
if(e.equals(arg0)) return true;
}
return false;
}
public boolean containsAll(Collection<?> arg0) {
for(Object o:arg0){
if(!this.contains(o)) return false;
}
return true;
}
public E get(int arg0) {
if(arg0 >-1 && arg0<this.size) return (E)data[arg0];
return null;
}
public int indexOf(Object arg0) {
for(int i=0;i<this.size;i++){
if(this.data[i].equals(arg0)) return i;
}
return -1;
}
public boolean isEmpty() {
return this.size==0;
}
public int lastIndexOf(Object arg0) {
for(int i=this.size-1;i>-1;i--){
if(this.data[i].equals(arg0)) return i;
}
return -1;
}
public Iterator<E> iterator() {
return null;
}
public boolean remove(Object arg0) {
for(int i=0;i<this.size;i++){
if(this.data[i].equals(arg0)){
this.remove(i);
return true;
}
}
return false;
}
public E remove(int arg0) {
if(arg0<0 ||arg0>this.size-1) return null;
E res = (E)data[arg0];
for(int i=arg0;i<this.size-1;i++){
this.data[i] = this.data[i+1];
}
this.size -= 1;
return res;
}
public boolean removeAll(Collection<?> arg0) {
int toberemovednums = arg0.size();
if(!this.containsAll(arg0)) return false;
int index=0;
for(int i=0;i<this.size;i++){
if(arg0.contains(data[i])){
this.remove(i);
}
}
return true;
}
public E set(int arg0, E arg1) {
if(arg0<0||arg0>this.size-1) return null;
this.data[arg0] = arg1;
return arg1;
}
public int size() {
return this.size;
}
//////////////////////////////////////////////
public Object[] toArray() {
if(this.size == 0) return null;
Object[] res = new Object[this.size];
for(int i=0;i<this.size;i++){
res[i] = this.data[i];
}
return res;
}
public <T> T[] toArray(T[] arg0) {
T[] res = (T[])(new Object[this.size]);
for(int i=0;i<this.size;i++){
res[i] = (T)data[i];
}
return res;
}
public boolean hasNext() {
// TODO �Զ����ɵķ������
return false;
}
public Object next() {
// TODO �Զ����ɵķ������
return null;
}
}