歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

編寫自己的迭代器的流程是:首先實現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則不然,每次調用都會返回一個從頭開始計數的迭代器。多個迭代器是互不干擾的。

具體例子:

import java.util.Iterator; 
 
/**
 * 實現Iterable<E>接口的Person類
 * @author yangqinjiang
 *
 */ 
public class Person implements Iterable<Person>{ 
 
 
    /**
    * 實現Iterable接口中要求實現的方法
    */ 
    @Override 
    public Iterator<Person> iterator() { 
        return new MyIterator();//返回一個MyIterator實例對象 
    } 
     
    /**
    * MyIterator是內部類,實現了Iterator<E>接口的類
    * 像這樣的內部類,在網絡上有很多這樣的寫法,我這裡只是參考他們的寫法罷了
    * @author yangqinjiang
    *
    */ 
    class MyIterator implements Iterator<Person>{ 
 
        /**相當於索引*/ 
        private int index =0; 
        @Override 
        public boolean hasNext() { 
            //只要在調用next()後,index自加,確保index不等於person的長度 
            return index!=person.length; 
        } 
 
        @Override 
        public Person next() { 
            //使用索引來獲取person數組中的某一項 
            return person[index++]; 
        } 
 
        @Override 
        public void remove() { 
            //未實現這個方法 
        } 
         
    } 
 
     
    private String name; 
    private int age; 
    /**person數組,是目標操作對象*/ 
    private Person[] person; 
     
    /**為了方便簡單點,故寫一個這樣的構造方法*/ 
    public Person(int size){ 
        person=new Person[size]; 
        for (int i = 0; i < size; i++) { 
            person[i]=new Person(""+i, i); 
        } 
    } 
     
    public void add(Person person){ 
        //未實現這個方法 
    } 
     
    public Person(){ 
        //未實現這個方法 
    } 
     
    public Person(String name,int age){ 
        this.name=name; 
        this.age=age; 
    } 
     
    //getter 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
    @Override 
    public String toString() { 
        return "person [name=" + name + ", age=" + age + "]"; 
    } 

Copyright © Linux教程網 All Rights Reserved