如果希望我们自己设计的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(); } }