如何用java按需定制自己的迭代器

来源:互联网 发布:超市商品条码数据库 编辑:程序博客网 时间:2024/06/05 10:02

编写自己的迭代器的流程是:首先实现Iterable接口,进而实现该接口中的Iterator<T> iterator()方法,该方法返回接口Iterator,Iterator接口中封装了next,hasnext,remove等方法。实现了Iterable接口的类能够通过foreach进行遍历,分析Iterable与Iterator的区别:

(1)Iterable是对Iterator的外层封装,对其加了一层外衣;

(2)接口Iterable依赖于Iterator接口;

(3)直接实现Iterable而不直接实现Iterator的原因:Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。

具体例子:

  1. import java.util.Iterator;  
  2.   
  3. /** 
  4.  * 实现Iterable<E>接口的Person类 
  5.  * @author yangqinjiang 
  6.  * 
  7.  */  
  8. public class Person implements Iterable<Person>{  
  9.   
  10.   
  11.     /** 
  12.      * 实现Iterable接口中要求实现的方法 
  13.      */  
  14.     @Override  
  15.     public Iterator<Person> iterator() {  
  16.         return new MyIterator();//返回一个MyIterator实例对象  
  17.     }  
  18.       
  19.     /** 
  20.      * MyIterator是内部类,实现了Iterator<E>接口的类 
  21.      * 像这样的内部类,在网络上有很多这样的写法,我这里只是参考他们的写法罢了 
  22.      * @author yangqinjiang 
  23.      * 
  24.      */  
  25.     class MyIterator implements Iterator<Person>{  
  26.   
  27.         /**相当于索引*/  
  28.         private int index =0;  
  29.         @Override  
  30.         public boolean hasNext() {  
  31.             //只要在调用next()后,index自加,确保index不等于person的长度  
  32.             return index!=person.length;  
  33.         }  
  34.   
  35.         @Override  
  36.         public Person next() {  
  37.             //使用索引来获取person数组中的某一项  
  38.             return person[index++];  
  39.         }  
  40.   
  41.         @Override  
  42.         public void remove() {  
  43.             //未实现这个方法  
  44.         }  
  45.           
  46.     }  
  47.   
  48.       
  49.     private String name;  
  50.     private int age;  
  51.     /**person数组,是目标操作对象*/  
  52.     private Person[] person;  
  53.       
  54.     /**为了方便简单点,故写一个这样的构造方法*/  
  55.     public Person(int size){  
  56.         person=new Person[size];  
  57.         for (int i = 0; i < size; i++) {  
  58.             person[i]=new Person(""+i, i);  
  59.         }  
  60.     }  
  61.       
  62.     public void add(Person person){  
  63.         //未实现这个方法  
  64.     }  
  65.       
  66.     public Person(){  
  67.         //未实现这个方法  
  68.     }  
  69.       
  70.     public Person(String name,int age){  
  71.         this.name=name;  
  72.         this.age=age;  
  73.     }  
  74.       
  75.     //getter  
  76.     public String getName() {  
  77.         return name;  
  78.     }  
  79.     public void setName(String name) {  
  80.         this.name = name;  
  81.     }  
  82.     public int getAge() {  
  83.         return age;  
  84.     }  
  85.     public void setAge(int age) {  
  86.         this.age = age;  
  87.     }  
  88.     @Override  
  89.     public String toString() {  
  90.         return "person [name=" + name + ", age=" + age + "]";  
  91.     } 


原创粉丝点击