爲什麼?將迭代器項指針移動到第一個位置的最好方法是什麼?爲什麼迭代器沒有任何重置方法?
回答
爲什麼?
因爲如果你強制迭代器有一個重置方法每迭代器必須有一個重置方法。這給每個迭代器編寫者帶來額外的工作。再加上一些迭代器非常難(或者非常昂貴)的重置,並且你不希望用戶調用它們的重置。文件或流的迭代器就是很好的例子。
將迭代器項指針移動到第一個位置的最佳方法是什麼?
創建一個新的迭代器。這很少比重置更昂貴。
最好的方法是創建一個新的!
您創建的前一個完全相同的方式 –
一旦你讀了一個流,你不能重新閱讀它,而無需再次打開源。這就是流和迭代器的工作方式。
這是JCF採用的一般趨勢 - 保持界面簡約,除非這使得某些功能非常難以工作。這就是爲什麼你沒有像不可變集合,固定大小集合等語義的獨立接口的原因。
至於爲什麼然後提供remove(Object)
(作爲可選) - 不提供這將使它不可能安全地刪除一個集合中的一個物品,同時迭代集合 - 沒有任何東西可以提供如此強制的reset()
。
同樣,爲什麼有一個單獨的ListIterator()
(提供方法等previous()
和previousIndex()
) - 以List
接口,同時正在使用它的主要功能是佈局元素WRT的指標,並能夠將能力以索引順序訪問它們,無論是固定順序還是隨機順序。對於其他集合,情況並非如此。如果沒有爲List
提供此接口,則如果不是不可能順利地使用列表,則會非常困難。
幾乎所有的'Iteratable'和'Iterator'都可以做幾件事情,它們可能已經被包含在界面中,但卻沒有。有用的迭代器方法將包括skip(相當於N個連續的移動調用,雖然許多迭代器可以在時間O(1)]和copyLocation中實現它[這將返回一個迭代器,該迭代器預期產生與原始相同的項目]。任何迭代器都可以實現'skip'方法,任何非巨大的有限迭代器都可以通過枚舉自己到一個數組來實現'copyLocation',然後同時擁有它和副本... – supercat
...從該數組返回項目。客戶端代碼本身可以執行任何操作,但是如果迭代器對客戶端代碼缺乏的內部工作有特殊的瞭解,它可以使用這些知識來提供數量級的速度改進。 – supercat
提示:創建您的迭代器變量作爲一個函數,然後你可以消耗它多次你想要的。這隻適用於底層邏輯是可重複的。 )迭代器
例斯卡拉(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
- 1. 迭代器接口中爲什麼沒有添加方法
- 2. 爲什麼std :: pair沒有迭代器?
- 3. 爲什麼這個迭代沒有返回任何東西?
- 4. 重置迭代器與擦除方法
- 5. 爲什麼JsArrayString沒有實現迭代?
- 6. 當沒有容器時作爲迭代器返回什麼?
- 7. 爲什麼PHP有迭代器對象?
- 8. Python迭代器:重置迭代器?
- 9. 爲什麼沒有故障安全迭代器拋出ConcurrentModificationException?
- 10. 方法迭代器和視圖之間有什麼區別?
- 11. 爲什麼沒有沒有參數的IsNullOrEmpty重載方法?
- 12. 爲什麼沒有任何整數方法適用於OpenGL?
- 13. 不知道爲什麼該方法沒有返回任何值
- 14. Java - 爲什麼沒有這個方法做任何事情
- 15. 在Rust中重用迭代器的最有效方法是什麼?
- 16. 爲什麼有兩種方法可以迭代Vector,IntoIterator和Iter?
- 17. 作業:使用私有迭代器類的迭代器方法
- 18. 有沒有一種方法,這段代碼可以失敗沒有迭代器?
- 19. 的forEach()迭代沒有定義方法
- 20. STL迭代器重置
- 21. 重置csv.reader()迭代器
- 22. Python:「'Nonetype'是不可迭代的」沒有任何迭代
- 23. 爲什麼沒有RelatedManager.add()接受一個迭代作爲參數?
- 24. 有沒有辦法記住python迭代器中的位置?
- 25. 爲什麼迭代器不兼容?
- 26. 爲什麼這個迭代器是const?
- 27. 爲什麼yield會返回迭代器?
- 28. 使用迭代器有什麼優勢?
- 29. 有什麼DSL流/迭代器?
- 30. 爲什麼後沒有做任何事
(除了事實上有一個'remove'方法,它*實際上並沒有真的給所有的迭代器「額外的工作」,因爲這個操作是可選的)。 – aioobe
@aioobe在某些情況下,通過移除當前對象迭代器使開發人員的生活變得非常簡單。有很少的情況下,這是真的重置(因爲你幾乎總是可以創建一個新的迭代器)。 – DJClayworth
@DJClayworth「給每個迭代器編寫者額外的工作。」這不是一個合理的迴應。圖書館的實施者需要做一點額外的努力,但收益是許多圖書館用戶會從中受益。 – stackoverflowuser2010