簡體   English   中英

如何為列表編寫Iterator?

[英]How to write Iterator for a list?

我有一個實現List接口並將數據存儲在Objects數組中的類。 現在,我需要為我的類編寫Iterator方法。 如何開始? 我考慮過編寫實現Iterator接口的子類。 類的對象將具有當前索引和最后一個索引的參數。 在每次調用next / hasNext時,將修改這些參數。 這種方法正確嗎? 但是,remove()方法存在問題,因為它應該允許刪除調用我的迭代器的類的對象。 如何解決呢? 我的主類的iterator()方法中還會發生什么?

我的偽代碼:

class MyCollection<T> implements List<T>{
    T[] tab;

    MyCollection(int len) {
        tab = (T[])new Object[len];
    }
    public Iterator iterator(){
    }
}

class MyIterator<T> implements Iterator {

    private int current;
    private int last;

    public void remove(){
    }

    public T next(){

    }

    public boolean hasNext(){

    }

}

我有一個實現List接口並將數據存儲在Objects數組中的類。

看來您正在重新實現ArrayList 有這樣做的充分理由嗎?

類的對象將具有當前索引和最后一個索引的參數。 在每次調用next / hasNext時,將修改這些參數。 這種方法正確嗎?

我認為您只需要一個索引。 但是基本思想是正確的。

但是,remove()方法存在問題,因為它應該允許刪除調用我的迭代器的類的對象。 如何解決呢?

有兩種方法:

  1. 從數組中刪除元素,並以某種方式排列“孔”。 a)將所有元素復制到大小為tab.length - 1的新數組中,或者b)使用System.arraycopy或等效元素在刪除的元素之后移動元素,或者c)將null分配給插槽並更改類以跳過null元素。 (最后一個可能是一個非常糟糕的主意...)

  2. MyIterator.remove()拋出UnsupportedOperationException 根據Iterator API規范, remove方法是可選方法。

我的主類的iterator()方法中還會發生什么?

它應該創建並返回MyIterator類的實例。

看一看java.util.ArrayList

class MyCollection<T> implements List<T>{
    T[] tab;

    MyCollection(int len) {
        tab = (T[])new Object[len];
    }
    public Iterator iterator(){
        return new MyIterator(tab);
    }
}

class MyIterator<T> implements Iterator {

    private int current = 0;
    private int last ;
    private T[] tab;

    public MyIterator(T[] tab){
       this.tab = tab;
    }

    public void remove(){
       throw UnsupportedException();
    }

    public T next(){
        current ++ ;
        return tab[current];
    }

    public boolean hasNext(){
        current == tab.length - 1;
    }

}

擴展java.util.AbstractList怎么樣? 畢竟,這就是java.util所有sun List實現(而不是java.util.concurrent )的全部功能。

這樣,您只需要實現

您可以免費獲得所有其他方法(包括iterator() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM