List遍历删除注意事项
生活随笔
收集整理的這篇文章主要介紹了
List遍历删除注意事项
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、遍歷集合刪除元素
(1)、容易出現的問題:
1 package collectionDemo.list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ListDemo { 7 8 public static void main(String[] args) { 9 List<String> sList = new ArrayList<String>(); 10 sList.add("0"); 11 sList.add("1"); 12 sList.add("2"); 13 sList.add("3"); 14 sList.add("4"); 15 System.out.println(sList); 16 // 對list進行遍歷,并按條件進行刪除 17 for (int i = 0; i < sList.size(); i++) { 18 if (i == 1 || i == 2) { 19 sList.remove(i); 20 } 21 } 22 System.out.println(sList); 23 24 } 25 26 }輸出結果為:
[0, 1, 2, 3, 4]
[0, 2, 4]
乍一看代碼,像是實現刪除索引為1和2的元素。但執行結果卻并非如此。在執行遍歷集合刪除元素時,當i==1時,集合remove掉索引為1(i)的元素,移除字符串1,此處是正常邏輯。但執行到i==2時,remove的卻是字符串3。原因如下:
使用普通for循環遍歷ArrayList時,是以索引為依據進行遍歷的。在遍歷過程中remove元素會導致索引的混亂。比如上例中,當remove(1)后,集合size將發生變化,元素將變少,字符串2所對應的索引將由2變為1,后邊的字符串3和4依次類推索引變為2和3,執行下一次循環時,i++為2,此時remove的是字符串3,所以導致了上述結果。
(2)解決方案1:
public class ListDemo {7 8 public static void main(String[] args) {9 List<String> sList = new ArrayList<String>(); 10 sList.add("0"); 11 sList.add("1"); 12 sList.add("2"); 13 sList.add("3"); 14 sList.add("4"); 15 System.out.println(sList); 16 // 對list進行遍歷,并按條件進行刪除 17 for (int i = 0; i < sList.size(); i++) { 18 if (i == 1 || i == 2) { 19 sList.remove(i);i--; 20 } 21 } 22 System.out.println(sList); 23 24 }添加了刪除元素后對下標i進行i--操作,保證下標不錯亂。
(3)解決方案2:
使用迭代器對集合進行遍歷,并進行集合中元素的刪除操作,如:
public class ListDemo {public static void main(String[] args) {List<String> sList = new ArrayList<String>();sList.add("0");sList.add("1");sList.add("2");sList.add("3");sList.add("4");System.out.println(sList);Iterator<String> iterator=sList.iterator();while(iterator.hasNext()){String item=iterator.next();if(item.equals("1")){iterator.remove();//sList.remove(item);注釋的用法是錯誤用法,迭代器中的迭代需使用迭代器進行刪除操作,不能在使用集合的remove方法,此種用法會導致java.util.ConcurrentModificationException }}System.out.println(sList);}}以上舉例以list為例,同理在map集合中存在同樣的問題,舉一反三。
?
轉載于:https://www.cnblogs.com/silenceshining/p/7492490.html
總結
以上是生活随笔為你收集整理的List遍历删除注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 3790 最短路径问题 (di
- 下一篇: Git 初始化及仓库创建及操作