[英]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()方法存在問題,因為它應該允許刪除調用我的迭代器的類的對象。 如何解決呢?
有兩種方法:
從數組中刪除元素,並以某種方式排列“孔”。 a)將所有元素復制到大小為tab.length - 1
的新數組中,或者b)使用System.arraycopy
或等效元素在刪除的元素之后移動元素,或者c)將null分配給插槽並更改類以跳過null
元素。 (最后一個可能是一個非常糟糕的主意...)
讓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.