ArrayList中remove()方法刪除長度大於5的元素之后下標重定位的問題


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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM