add,iterator,toString三个方法实现
2015-10-19 19:41
274 查看
对于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());
}
}
无论我加入多少个对象,都没有问题啊。
如果数组满了
扩大数组空间….
下面写代码,边写边分析
首先是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());
}
}
无论我加入多少个对象,都没有问题啊。
相关文章推荐
- mysql 视图
- 一些程序OEP入口特征
- android中操纵sqlite数据库
- BZOJ2705: [SDOI2012]Longge的问题
- java基础学习笔记——集合框架
- sort函数的cmp函数怎么写?
- C语言中的break、continue和goto三者的区别与用法
- HDU 2577 DP
- C-基本语法与运算
- spring-session实例
- 从软件工程视角,回顾分析本科毕业设计软件中存在的不足问题
- Linux下抓包工具tcpdump以及分析包的工具wireshark
- 3盏灯和3个开关的对应关系
- Facebook人工智能实验室的前世今生
- tiled map中折线的提取
- Gallery 和probe数据集
- Python中assert的用法
- 【颗粒归仓,自考总结】——数据库系统原理总结
- 归档备忘!
- 为什么匿名内部类和局部内部类只能访问final变量