1、問題闡述
需求描述:
有一個ArrayList數組,要求刪除長度大於5的字符串,如:arr = {"ab1","123ad","bca","dadfadf","dddaaa","你好啊","我來啦","別跑啊"};
要求結果輸出:
{"ab1","123ad","bca","你好啊","我來啦","別跑啊"}
遇到的問題:
刪除元素可以用remove()方法,我開始用的是for循環來操作,先循環遍歷arr集合,如果發現該元素的長度大於5就刪除該元素。此時出現如下幾個問題:
問題1:假設此時刪除的元素下標為3,后面的元素會自動往前移動一位,填補被刪除了的元素,下一次循環遍歷下標就變成了4,直接跳過了之前填補的位置,但剛剛的位置的元素已經變了,此時這個元素已經遍歷不到了。
問題2:刪除了元素但arr的長度此時還是原來的長度,沒有更新,結果導致數組下標溢出。
思考之后發現使用for循環的弊端就是i++及arr.size()的問題。
中心難點是如何能夠在再一次遍歷剛剛位置上的元素,彌補刪除元素之后自動跳到下一個元素的漏洞。問題代碼與圖解如下:
1 for (int j = 0; j < arr.size(); j++) { 2 String str = (String) arr.get(i); 3 if (str.length() > 5) { 4 arr.remove(str); 5 } 6 }
錯誤提示:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
2、解決方案
方案1:使用迭代器,利用迭代器的remove方法刪除元素,優點是不用考慮數組的長度
Iterator it = arr.iterator(); while (it.hasNext()) { String str = (String) it.next(); if (str.length() > 5) { // 判斷字符串的長度是否大於5 it.remove(); // 使用迭代器的remove方法 } else { System.out.println(str); } }
方案2:使用迭代器,利用迭代器Iterator的子類listIterator的remove方法刪除元素
ListIterator it = (ListIterator) arr.listIterator(); while (it.hasNext()) { String str = (String) it.next(); if (str.length() > 5) { it.remove(); } }
3、經驗總結
① 如果遍歷集合的時候,不需要對集合中的元素進行操作(增加、刪除),推薦使用增強for循環
② 如果遍歷集合的時候,需要對集合中的元素進行操作(增加、刪除),那么只能使用迭代器
- 使用迭代器進行迭代器(Iterator)進行操作時,不允許使用集合的add、remove方法,但是可以使用迭代器的remove方法
- Iterator還有一個子接口(ListIterator),提供了add和remove方法,可以在遍歷list集合的時候,對集合進行增加刪除操作。
閱罷此文,如果您覺得本文不錯並有所收獲,請【打賞】或【推薦】,也可【評論】留下您的問題或建議與我交流。 你的支持是我不斷創作和分享的不竭動力! |
作者:寒冰雪
出處:https://home.cnblogs.com/u/snow1234/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。
|