雖然for-each循環有許多優點,但問題是,它不起作用,當你想要過濾(過濾意味着從列表中刪除元素)列表,你可以請任何替換,甚至遍歷索引是不是一個好選項..什麼是用於過濾的For-Each循環的替換?
回答
你是什麼意思的「過濾」?從列表中刪除某些元素?如果是這樣,你可以使用一個iterator:
for(Iterator<MyElement> it = list.iterator(); it.hasNext();) {
MyElement element = it.next();
if (some condition) {
it.remove();
}
}
更新(基於評論):
請看下面的例子來說明迭代是如何工作的。比方說,我們有一個包含「A」和'B的列表:
A A B B A
我們要刪除所有那些討厭的B
秒。因此,使用上述循環,代碼將如下工作:
- hasNext()?是。下一個()。
element
指向1st A. - hasNext()?是。下一個()。
element
指向2nd A. - hasNext()?是。下一個()。
element
指向1st B. remove()。迭代器計數器不會改變,它仍然指向B所在的位置(從技術上講,這並不完全正確,但在邏輯上就是它的工作原理)。如果你現在再次調用remove(),你會得到一個異常(因爲list元素不再存在)。 - hasNext()?是。下一個()。
element
指向2nd B.其餘部分與#3相同 - hasNext()?是。下一個()。
element
指向第3位A. - hasNext()?不,我們完成了。列表現在有3個元素。
更新#2:remove()
操作上確實迭代器可選 - 但只是因爲它是在底層集合可選。這裏的底線是 - 如果你的集合支持它(以及Java Collection Framework中的所有集合),那麼迭代器也是如此。如果你的收藏不支持它,反正你運氣不好。
ChssPly76的答案在這裏是正確的方法 - 但我對你的背後的思想很感興趣,「遍歷索引不是一個好選擇」。在很多情況下 - 通常情況下是ArrayList
- 這是非常有效的。 (事實上,在arraylist的情況下,我認爲重複調用get(i++)
比使用迭代器稍微快一點,儘管遠遠不足以犧牲可讀性。從廣義上講,如果所討論的對象實現了java.util.RandomAccess,那麼通過索引訪問順序元素應該與使用迭代器的速度大致相同。如果它不(例如LinkedList
將是一個很好的反例),那麼你是對的;但不要忽略這個選項。
Actaully我說緊靠這一特定情況下,只有.. –
是的,但是這並沒有改變的東西 - 如果此特定情況下,您的列表是一個'ArrayList'(或類似),那麼基於索引的訪問將是**快**(甚至比使用迭代器稍快),所以這是一個不錯的選擇。如果這是一種通用的庫方法,它可能會採用各種列表,但您無法控制這些列表的實現 - 那麼假設(儘管您仍然可以檢查接口實現)將會很糟糕。 –
@dtsazza - 你完全正確的表現(+1)。但是,索引循環的問題是,如果您需要從集合中刪除某些元素,那麼將其混淆非常容易。在for循環中修改索引只是不好的業力;而循環需要額外的外部櫃檯,只是感覺不太乾淨。 – ChssPly76
我已經使用公共收藏CollectionUtils的
filter(java.util.Collection collection, Predicate predicate)
方法取得了成功。
可以請您在這裏闡述你的答案,這將是對我非常有用,以及爲他人在未來 –
它是如此討厭,這些接口是不genericised。這就是爲什麼我喜歡谷歌收藏 – daveb
如果你和我一樣,不喜歡改變的集合,而通過它的元素,或者如果迭代器只是不提供刪除的實現,你可以使用臨時集合僅僅收取迭代您要刪除的元素。是的,是的,它的效率不高相比,修改迭代器,但對我來說更清晰明白髮生了什麼:
List<Object> data = getListFromSomewhere();
List<Object> filter = new ArrayList<Object>();
// create Filter
for (Object item: data) {
if (throwAway(item)) {
filter.add(item);
}
}
// use Filter
for (Object item:filter) {
data.remove(item);
}
filter.clear();
filter = null;
- 1. 轉換的foreach用於循環
- 2. AngularJS:替換foreach循環中的文本
- 3. 的Perl:用foreach循環替換文本行多串並替換
- 4. 什麼是用於sql循環的遊標的替代方法?
- 5. 爲什麼通過foreach循環的值不是0?
- 6. 爲什麼使用`foreach`循環數組對象快於lambda`ForEach`?
- 7. Array_combine在foreach循環中還是什麼?
- 8. 如何用for循環替換foreach循環
- 9. 如何過濾simplexml_load_file foreach循環?
- 10. 在foreach循環中過濾數組
- 11. Stata foreach循環替換缺失值
- 12. 用於循環替換的Matlab
- 13. 用於循環替換的模板
- 14. 是否有可能使用Linq來替換這個Foreach循環
- 15. 是否有可能用Linq替換這個foreach循環?
- 16. 通過Json循環的foreach循環
- 17. 在Python中用於(不是foreach)循環
- 18. 如何foreach循環轉換成用於循環在c#
- 19. 更換while循環用foreach
- 20. foreach循環終於
- 21. 的foreach循環foreach循環中(Java)的
- 22. 什麼是「for(;;)」循環用於?
- 23. 我應該用LINQ替換這些嵌套的foreach循環嗎?
- 24. 使用foreach循環替換屬性的某些字符
- 25. 如何使用遞歸方法替換內部的Foreach循環
- 26. 循環替換大於0的值
- 27. PHP中的foreach循環的順序是什麼?
- 28. 在foreach循環內的foreach循環
- 29. FOREACH foreach循環內循環
- 30. 具有用於foreach循環的UL
@ ChssPly76:感謝名單答覆,是的,我用同樣的意思,但它不會影響迭代當我刪除一個元素時,Iterator中的元素來自同一個INSTANCE。 我想從列表(列表)中刪除元素 –
我敢肯定調用remove()的迭代器會影響到基礎列表。否則就沒有意義了。 – Herms
它肯定會從底層列表中刪除元素。它不會影響迭代,但是 - remove()會在「current」元素(從最後一個'next()'方法調用返回的元素)上被調用,並且它不會改變「current」元素。接下來調用next()將返回列表中的下列元素。 – ChssPly76