如果希望我们自己设计的ADT支持可迭代,即可以使用
for(X x :xxxx)
Iterator<E> ITER =xxxx.iterator();
while(iter.hasNext()) {...};
的方式来遍历进行一些列操作即Iterable,则可以使用Iterable 和Iterator
这样做的好处是可以进行迭代而不需要知道ADT里面具体是如何实现的,是使用的什么样的数据结构这些都无所谓。
Iterable接口:实现该接口的集合对象是可迭代遍历的
public interface Iterable<T>{
...
Iterator<T> iterator();
}
Iterator 迭代器,是一个接口
public interface Iterator<E>{
boolean hasNext();
E next();
void remove();
}
下面给出一个具体的例子:
public static void main(String[] args) {
petHospital h = new petHospital();
Dog dog1 = new Dog(1,"Mary");
Dog dog2 = new Dog(3,"Elizabeth");
Dog dog3 = new Dog(2,"Anne Boleyn");
h.add(dog1);
h.add(dog2);
h.add(dog3);
for(Dog d :h)
{
System.out.println(d);
}
}
}
class Dog implements Comparable<Dog> {
int age;
String name ;
public Dog (int age,String name)
{
this.age=age;
this.name=name;
}
@Override
public int compareTo(Dog o) {
// TODO Auto-generated method stub
return (this.age>o.age)? 1:-1;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+" "+age;
}
}
class petHospital implements Iterable<Dog>
{
List<Dog> dogs =new ArrayList<Dog>() ;
public void add(Dog d)
{
dogs.add(d);
}
@Override
public Iterator<Dog> iterator() {
// TODO Auto-generated method stub
return new petHospitalIterator();
}
private class petHospitalIterator implements Iterator<Dog> {
// 当前迭代元素的下标
private int index = 0;
// 判断是否还有下一个元素,如果迭代到最后一个元素就返回false
public boolean hasNext() {
return index != dogs.size();
}
@Override
public Dog next() {
return dogs.get(index++);
}
// 这里不支持,抛出不支持操作异常
public void remove() {
throw new UnsupportedOperationException();
}
}
浙公网安备 33010602011771号