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