2011-10-07 67 views

回答

32

爲什麼?

因爲如果你強制迭代器有一個重置方法迭代器必須有一個重置方法。這給每個迭代器編寫者帶來額外的工作。再加上一些迭代器非常難(或者非常昂貴)的重置,並且你不希望用戶調用它們的重置。文件或流的迭代器就是很好的例子。

將迭代器項指針移動到第一個位置的最佳方法是什麼?

創建一個新的迭代器。這很少比重置更昂貴。

+6

(除了事實上有一個'remove'方法,它*實際上並沒有真的給所有的迭代器「額外的工作」,因爲這個操作是可選的)。 – aioobe

+0

@aioobe在某些情況下,通過移除當前對象迭代器使開發人員的生活變得非常簡單。有很少的情況下,這是真的重置(因爲你幾乎總是可以創建一個新的迭代器)。 – DJClayworth

+1

@DJClayworth「給每個迭代器編寫者額外的工作。」這不是一個合理的迴應。圖書館的實施者需要做一點額外的努力,但收益是許多圖書館用戶會從中受益。 – stackoverflowuser2010

3

最好的方法是創建一個新的!

+1

您創建的前一個完全相同的方式 –

6

一旦你讀了一個流,你不能重新閱讀它,而無需再次打開源。這就是流和迭代器的工作方式。

3

這是JCF採用的一般趨勢 - 保持界面簡約,除非這使得某些功能非常難以工作。這就是爲什麼你沒有像不可變集合,固定大小集合等語義的獨立接口的原因。

至於爲什麼然後提供remove(Object)(作爲可選) - 不提供這將使它不可能安全地刪除一個集合中的一個物品,同時迭代集合 - 沒有任何東西可以提供如此強制的reset()

同樣,爲什麼有一個單獨的ListIterator()(提供方法等previous()previousIndex()) - 以List接口,同時正在使用它的主要功能是佈局元素WRT的指標,並能夠將能力以索引順序訪問它們,無論是固定順序還是隨機順序。對於其他集合,情況並非如此。如果沒有爲List提供此接口,則如果不是不可能順利地使用列表,則會非常困難。

+0

幾乎所有的'Iteratable'和'Iterator'都可以做幾件事情,它們可能已經被包含在界面中,但卻沒有。有用的迭代器方法將包括skip(相當於N個連續的移動調用,雖然許多迭代器可以在時間O(1)]和copyLocation中實現它[這將返回一個迭代器,該迭代器預期產生與原始相同的項目]。任何迭代器都可以實現'skip'方法,任何非巨大的有限迭代器都可以通過枚舉自己到一個數組來實現'copyLocation',然後同時擁有它和副本... – supercat

+0

...從該數組返回項目。客戶端代碼本身可以執行任何操作,但是如果迭代器對客戶端代碼缺乏的內部工作有特殊的瞭解,它可以使用這些知識來提供數量級的速度改進。 – supercat

2

提示:創建您的迭代器變量作爲一個函數,然後你可以消耗它多次你想要的。這隻適用於底層邏輯是可重複的。 )迭代器 迭代器= iteratable.iterator(;:

例斯卡拉(Java類似,但我沒有一個Java REPL方便)

def i = (1 to 100) iterator // i is our iterator 
i.grouped(50) foreach println // prints two groups 
i.grouped(50) foreach println // prints same two groups again 
相關問題