Iterable和Iterator
foreach循环可以很方便的迭代集合中的每个元素。前提是该集合必须实现Iterable接口。Iterable接口是java.lang包中的,当我们自己定义一个抽象数据类型的集合,并且想要实现foreach迭代其中的每个元素的话,就要implements Iterable,并且实现iterator方法,该方法需要返回一个迭代器。
迭代器也是我们自己需要定义的一个类,该类必须implements Iterator接口,并且实现两个方法:hasNext和next方法。
下面是我自己定义的一个抽象数据类型,自动改变大小的栈,用数组实现。
public class ResizingArrayStack<Item> implements Iterable<Item> {
//初始容量为1
private Item[] a = (Item[]) new Object[1];
//初始大小为0
private int N=0;
public boolean isEmpty(){
return N==0;
}
public int size(){
return N;
}
public void resize(int max){
Item[] temp= (Item[]) new Object[max];
for (int i=0;i<N;i++){
temp[i]=a[i];
}
a=temp;
}
public void push(Item item){
if(N==a.length)
resize(2*a.length);
a[N++]=item;
}
public Item pop(){
Item item=a[--N];
if(N>0 && N==a.length/4)
resize(a.length/2);
return item;
}
@Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item>{
private int i=N;
@Override
public boolean hasNext() {
return i>0;
}
@Override
public Item next() {
return a[--i];
}
}
}
测试用例:
public class ResizingArrayStackTest {
public static void main(String[] args) {
ResizingArrayStack<String> stack=new ResizingArrayStack<>();
stack.push("aaa");
stack.push("zzz");
stack.push("www");
stack.push("bbb");
stack.push("ppp");
for (String s:stack){
System.out.println(s);
}
}
}
输出结果:
ppp
bbb
www
zzz
aaa