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

  

 

posted on 2018-06-19 21:12  暮雨煙深淺  阅读(354)  评论(0编辑  收藏  举报