add,iterator,toString三个方法实现

来源:互联网 发布:mac中的照片怎么导出 编辑:程序博客网 时间:2024/05/21 00:48

对于add操作,我想到了下面的特殊情况:

如果数组满了

              扩大数组空间….

 

 

下面写代码,边写边分析

首先是add


@Override
public void add(T obj) {
//首先要想特殊情况:如果数组容量不够怎么办?扩展容量呗
if(capacity==size)
expandCapacity();//这个方法先写在这里。
//可以放心的添加了
container[size++]=obj;
}

expandCapacity()这个方法当然用私有的了。

private void expandCapacity() {
//扩展container的容量。每个人都能想到的思路就是创建一个更大的数组,然后
//把原来数组的元素复制过去
T[] biger = (T[])new Object[capacity+increment];
//复制,system有个方法
System.arraycopy(container, 0, biger, 0, size);
//别忘了更新container,capacity
this.container = biger;
capacity = capacity+increment;
}


然后我要测试一下add方法好不好使,我就要遍历这个容器。就要让ArrayList 实现Iterable接口.然后实现唯一的iterator方法就行了。

public class ArrayList<T> implements List<T>, Iterable<T>{

..

@Override
public Iterator<T> iterator() {
//迭代容器就是把所有装的东西取出来
//这个方法返回的是一个Iterator<T>对象。先定义一个,那就new一个这个接口的对象
return new ArrayListIterator<T>();

}

//建立一个内部类现在变成一个自然而然的做法

private class ArrayListIterator<T> implements Iterator<T>{


//这个类有2个方法。针对我们的容器,实现这2个方法。同样的
//要实现hasNext(),next(),需要有当前“位置”支持,所以这个内部类
//要建立一个成员
private int currentPosition=-1;//最开始在0的左边
@Override
public boolean hasNext() {
//每个人都能想到怎么判断了
//如果currentPosition < maxIndexOfContainer,就true了
if(currentPosition < (size-1)){
return true;
}else
return false;
}


@Override
public T next() {
//每个人都知道怎么做
currentPosition++;
return (T) container[currentPosition];
}

}

}



为了方便测试,所以要实现toString()方法。其实这也是写Iterator的一部分原因O(∩_∩)O哈!

public String toString(){
//调用了iterator,然后把元素的toString累计到一起就行了。每个人都会。。
Iterator<T> it  =  iterator();
StringBuilder sb = new StringBuilder();
while(it.hasNext()){
sb.append(it.next().toString()+"\n");
}
return sb.toString();
}


现在就可以放心的测试add方法了。为了更方便,使用junit测试。呵呵,这里使用Integer,还是图方便啊。其实可以用自己的对象啊,只不过要实现toString.

Integer已经给我实现好了。恩。开始测试


public class TestArrayList {
ArrayList<Integer> al;
@Before
public void setUp() throws Exception {
al = new ArrayList<Integer>();
}


@Test
public void testAdd() {
for (int i = 0; i < 122; i++) {
al.add(i);
}
System.out.println(al.toString());
}


}


无论我加入多少个对象,都没有问题啊。





0 0