1. 程式人生 > >如何正確在集合遍歷的時候刪除多個元素

如何正確在集合遍歷的時候刪除多個元素

前言

不管是集合中的遍歷還是刪除集合中元素,這些操作相比大家都很熟悉,但是在日常開發中,我們有時候會遇到在集合遍歷的時候刪除集合中的元素。那麼這裡面有什麼哪些小竅門呢?為什麼標題上說是刪除多個元素,難倒刪除多個元素和刪除單個元素有什麼區別?

常見的for迴圈遍歷中刪除元素

具體程式碼如下

/**
* @ClassName: ForDemo
* @Description: TODO(通過for迴圈來測試,刪除集合中名字為小明的元素)
* @author 愛琴孩
*/
public class ForDemo {
    public static void main(String[] args) {
        List<Student> studentList=new
ArrayList<Student>(); Student stua1=new Student("小紅",20); Student stua2=new Student("小明",21); Student stua3=new Student("小朱",22); Student stua4=new Student("小明",24); Student stua5=new Student("小明",28); studentList.add(stua1); studentList.add(stua2); studentList.add(stua3); studentList.add(stua4); studentList.add(stua5); for
(int i=0; i<studentList.size();i++){ if("小明".equals(studentList.get(i).getName())){ studentList.remove(studentList.get(i)); } } for(int i=0;i<studentList.size();i++){ System.out.println("去掉小明之後學生姓名"+studentList.get(i).getName()); } } }

執行結果如下
這裡寫圖片描述
可以看到,程式碼是正常執行了,但是仔細看控制檯的結果,發現小明還是存在的,這是為什麼呢???
這是因為在list通過for迴圈遍歷中刪除元素之後,後面的元素會上前替補前面元素的位置,這樣就有可能會導致元素遍歷過程中某些元素被漏掉,結果就出現了上面的那種結果。顯然通過這種方式是不能精確地刪除集合中所有滿足條件的元素,剛才也說過是因為元素位置發生了變化導致了這種情況,那麼我們可不可以換一種思路,倒序for迴圈遍歷呢??將上面的程式碼改為倒序遍歷,程式碼如下

for(int i=studentList.size()-1; i>=0;i--){
    if("小明".equals(studentList.get(i).getName())){
    studentList.remove(studentList.get(i));
    }
}

測試結果如下
這裡寫圖片描述明顯看出,這種思路是可以的

利用增強for迴圈來進行遍歷

增強for迴圈在日常開發中是比較常見的,那麼我們能不能通過這種方式來實現遍歷的時候刪除元素呢?實踐是檢驗真理的那個啥??後面不記得了,試試吧,用下列程式碼替換上面的for迴圈遍歷

for(Student student :studentList){
    if("小明".equals(student.getName())){
        studentList.remove(student);
    }
}

測試結果如下
這裡寫圖片描述如上所示,這是list集合中fail-fast機制,但出現在集合遍歷的時候,改變元素,就會報ConcurrentModificationException,所以利用增強for迴圈實現該功能是不可行的。

利用Iterator迭代器進行迴圈遍歷

迴圈遍歷程式碼如下

Iterator<Student> it=studentList.iterator();
while(it.hasNext()){
    if("小明".equals(it.next().getName())){
        it.remove();
    }
}

測試結果如下
這裡寫圖片描述
顯然也是可以達到效果的,但是這裡需要注意的一點是,這裡是通過iterator的remove()方法來進行刪除的,而不是通過list.remove()方法來刪除,如果還是用list.remove(),依舊會出現上面那種問題。
通過Iterator來遍歷,用list.remove()來刪除,測試程式碼如下

Iterator<Student> it=studentList.iterator();
while(it.hasNext()){
    if("小明".equals(it.next().getName())){
        studentList.remove(it.next());
    }
}

測試結果如下
這裡寫圖片描述

總結

集合在遍歷的時候,如果只是刪除其中的一個元素,上述所有方法都是可以的,但是集合中其他元素的後續刪除就不行了,因為前面的元素刪除導致後續元素的位置發生了改變。
小細節,有時候很容易就忽視了,但是有時候小細節能讓你付出幾個小時甚至一天的時間來修復bug!

相關推薦

List集合一次刪除元素

JAVA中迴圈遍歷list有三種方式:   for迴圈、增強for迴圈(也就是常說的foreach迴圈)、iterator遍歷。 1、for迴圈遍歷list for(int i=0;i<list.size();i++){ if(list.get(i).equals

如何正確集合的時候刪除元素

前言 不管是集合中的遍歷還是刪除集合中元素,這些操作相比大家都很熟悉,但是在日常開發中,我們有時候會遇到在集合遍歷的時候刪除集合中的元素。那麼這裡面有什麼哪些小竅門呢?為什麼標題上說是刪除多個元素,難倒刪除多個元素和刪除單個元素有什麼區別? 常見的for

java集合刪除指定元素異常分析總結

它的 一次 但是 代碼 元素 拋出異常 源碼 刪除指定元素 test 在使用集合的過程中,我們經常會有遍歷集合元素,刪除指定的元素的需求,而對於這種需求我們往往使用會犯些小錯誤,導致程序拋異常或者與預期結果不對,本人很早之前就遇到過這個坑,當時沒註意總結,結果前段時間又遇到

php從一個數組中刪除元素,獲取陣列鍵值對等……

$array1 = array(1,2,3,4,5,6); $array2 = array(2,3); //1、獲取陣列鍵值對 $arr1 = array_keys($array2); var_dump($arr1); Array ( [0] => 0 [1] =&g

pat 甲級1138 後序的第一元素

題目描述: Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and inorder traversal sequences, you

javascript陣列刪除元素

刪除應該有兩個函式delete和splice(),下面我用了delete這個函式 var video_ids = this.data.checkedVideoIds; var watchVideoIds = wx.getStorageSync('watchVideoIds

ArrayList 集合 刪除 篩選重複資料

ArrayList遍歷刪除篩選 在做資料處理中ArrayList我們用的是最多的,今天總結一下ArrayList在使用中的一些常用功能: 遍歷ArrayList的資料、 刪除ArrayList的資料、篩選掉ArrayList的重複資料。 ArrayList遍歷,通常有三

android通過處理按鈕點選事件

如果我們有很多的按鈕都有點選事件的話,那麼單單靠switch case是很麻煩的,因為你需要在每個case後面加上一個R.id.xx。這樣的程式碼看起來不整潔也很麻煩。那麼如果我們使用遍歷的方法來處理的話就是方便許多。首先我們先來了解一下獲取控制元件id的方式:1:反射:tr

集合過程iterator, 添加刪除元素報異常

exc asn 一致性 使用 遍歷 one mov exceptio 刪除 list set 遍歷過程中添加或者刪除元素,報異常。 使用iterator 也會報異常 ConcurrentModificationException remove只能用叠代器的remov

java中迴圈刪除List和Set集合元素的方

1.異常java一邊遍歷一邊刪除集合中的元素會報異常ConcurrentModificationException 2.正確的做法如下:   package list; import java.util.*; public class Demo { public

mybatis的配置檔案中使用兩foreach進行集合的問題

<select id="selectTrafficEventIngByType" resultMap="BaseResultMap"> select <include refid="Base_Column_List"/> f

如何正確刪除List中的元素,你會嗎?

遍歷刪除List中的元素有很多種方法,當運用不當的時候就會產生問題。下面主要看看以下幾種遍歷刪除List中元素的形式:1.通過增強的for迴圈刪除符合條件的多個元素2.通過增強的for迴圈刪除符合條件的一個元素3.通過普通的for刪除刪除符合條件的多個元素4.通過Iterator進行遍歷刪除符合條件的多個元素

集合過程中刪除集合元素問題

集合遍歷過程中如何刪除集合元素,,這個問題應該很簡單,用迭代器即可; public static void main(String[] args) { List<String> strList = new ArrayList<String

正確刪除List元素

最近在寫程式碼的時候遇到了遍歷時刪除List元素的問題,在此寫一篇部落格記錄一下。 一般而言,遍歷List元素有以下三種方式: 使用普通for迴圈遍歷使用增強型for迴圈遍歷使用iterator遍歷使用普通for迴圈遍歷 程式碼如下: public class Main

如何正確刪除List中的元素(普通for迴圈、增強for迴圈、迭代器iterator、removeIf+方法引用)

遍歷刪除List中符合條件的元素主要有以下幾種方法: 普通for迴圈 增強for迴圈 foreach 迭代器iterator removeIf 和 方法引用 (一行程式碼搞定) 其中使用普通for迴圈容易造成遺漏元素的問題,增強for迴圈foreach會報java.util.Concurre

js 刪除數組中元素

true arr return contain index var nbsp log dex js中如果使用forEach的話 , splice刪除的時候會導致js的數組的length發生改變 , 因此會出現本應該刪除的元素沒有被刪除 . 因此 , 我的想法是 : 使用i

移動List集合元素

/** * * @version 2018年2月7日 上午10:03:57 * @param input 元素集合 * @param selectedList 需要被移動的元素 * @param cursor 移動的位數 */ private void moveElement(Lis

三、set集合容器-刪除查詢與自定義

簡介:要學習set集合容器,首先要了解紅黑樹(Red-black Tree)。紅黑樹是一種自平衡二叉查詢樹,是電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。Set集合容器實現了紅黑樹的平衡二叉檢索樹的資料結構,在插入元素時,它會自動調整二叉樹的排列,把該元素放到適當的位置,以確保每個子樹根

用C語言實現在一個連結串列刪除指定的一個或元素

#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }LinkList; //建立一個連結串列  LinkL

列表的使用(append,count,extend,index,pop,remove)dir;找出列表中指定一個或元素刪除

斜體樣式列表:在一個數組裡存或者取多個資訊 列表操作功能有:索引 切片 追加 刪除 長度 迴圈 包含 列表舉例:name_list=[“R”,“u”,“b”,“y”] print(name_list[1]) >>>u pr