1. 程式人生 > >如何正確遍歷刪除List中的元素,你會嗎?

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

遍歷刪除List中的元素有很多種方法,當運用不當的時候就會產生問題。下面主要看看以下幾種遍歷刪除List中元素的形式:

1.通過增強的for迴圈刪除符合條件的多個元素

2.通過增強的for迴圈刪除符合條件的一個元素

3.通過普通的for刪除刪除符合條件的多個元素

4.通過Iterator進行遍歷刪除符合條件的多個元素

Java程式碼  收藏程式碼
  1. /** 
  2.  * 使用增強的for迴圈 
  3.  * 在迴圈過程中從List中刪除元素以後,繼續迴圈List時會報ConcurrentModificationException 
  4.  */  
  5. public void listRemove() {  
  6.     List<Student> students = this
    .getStudents();  
  7.     for (Student stu : students) {  
  8.         if (stu.getId() == 2)   
  9.             students.remove(stu);  
  10.     }  
  11. }  
Java程式碼  收藏程式碼
  1. /** 
  2.  * 像這種使用增強的for迴圈對List進行遍歷刪除,但刪除之後馬上就跳出的也不會出現異常 
  3.  */  
  4. public void listRemoveBreak() {  
  5.     List<Student> students = this.getStudents();  
  6.     for (Student stu : students) {  
  7.         if (stu.getId() == 2) {  
  8.             students.remove(stu);  
  9.             break;  
  10.         }  
  11.     }  
  12. }  
Java程式碼  收藏程式碼
  1. /** 
  2.  * 這種遍歷有可能會遺漏某個元素,因為刪除元素後List的size在 
  3.  * 變化,元素的索引也在變化,比如你迴圈到第2個元素的時候你把它刪了, 
  4.  * 接下來你去訪問第3個元素,實際上訪問到的是原先的第4個元素。當訪問的元素 
  5.  * 索引超過了當前的List的size後還會出現陣列越界的異常,當然這裡不會出現這種異常, 
  6.  * 因為這裡每遍歷一次都重新拿了一次當前List的size。
     
  7.  */  
  8. public void listRemove2() {  
  9.     List<Student> students = this.getStudents();  
  10.     for (int i=0; i<students.size(); i++) {  
  11.         if (students.get(i).getId()%3 == 0) {  
  12.             Student student = students.get(i);  
  13.             students.remove(student);  
  14.         }  
  15.     }  
  16. }  
Java程式碼  收藏程式碼
  1. /** 
  2.  * 使用Iterator的方式也可以順利刪除和遍歷 
  3.  */  
  4. public void iteratorRemove() {  
  5.     List<Student> students = this.getStudents();  
  6.     System.out.println(students);  
  7.     Iterator<Student> stuIter = students.iterator();  
  8.     while (stuIter.hasNext()) {  
  9.         Student student = stuIter.next();  
  10.         if (student.getId() % 2 == 0)  
  11.             stuIter.remove();//這裡要使用Iterator的remove方法移除當前物件,如果使用List的remove方法,則同樣會出現ConcurrentModificationException  
  12.     }  
  13.     System.out.println(students);  
  14. }  

附完整程式碼如下:

Java程式碼  收藏程式碼
  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4. public class ListRemove {  
  5.     public static void main(String args[]) {  
  6.         ListRemove lr = new ListRemove();  
  7.         lr.listRemove();  
  8.         lr.listRemoveBreak();  
  9. //      lr.listRemove2();  
  10. //      lr.iteratorRemove();  
  11.     }  
  12.     /** 
  13.      * 使用增強的for迴圈 
  14.      * 在迴圈過程中從List中刪除元素以後,繼續迴圈List時會報ConcurrentModificationException 
  15.      */  
  16.     public void listRemove() {  
  17.         List<Student> students = this.getStudents();  
  18.         for (Student stu : students) {  
  19.             if (stu.getId() == 2)   
  20.                 students.remove(stu);  
  21.         }  
  22.     }  
  23.     /** 
  24.      * 像這種使用增強的for迴圈對List進行遍歷刪除,但刪除之後馬上就跳出的也不會出現異常 
  25.      */  
  26.     public void listRemoveBreak() {  
  27.         List<Student> students = this.getStudents();  
  28.         for (Student stu : students) {  
  29.             if (stu.getId() == 2) {  
  30.                 students.remove(stu);  
  31.                 break;  
  32.             }  
  33.         }  
  34.     }  
  35.     /** 
  36.      * 這種不使用增強的for迴圈,每次重新獲取list的size遍歷的情況執行時不會報錯,但是可能刪除的結果是錯的。 
  37.      */  
  38.     public void listRemove2() {  
  39.         List<Student> students = this.getStudents();  
  40.         for (int i=0; i<students.size(); i++) {  
  41.             if (students.get(i).getId()%2 == 0)  
  42.                 students.remove(i);  
  43.         }  
  44.     }  
  45.     /** 
  46.      * 使用Iterator的方式也可以順利刪除和遍歷 
  47.      */  
  48.     public void iteratorRemove() {  
  49.         List<Student> students = this.getStudents();  
  50.         System.out.println(students);  
  51.         Iterator<Student> stuIter = students.iterator();  
  52.         while (stuIter.hasNext()) {  
  53.             Student student = stuIter.next();  
  54.             if (student.getId() % 2 == 0)  
  55.                 stuIter.remove();  
  56.         }  
  57.         System.out.println(students);  
  58.     }  
  59.     private List<Student> getStudents() {  
  60.         List<Student> students = new ArrayList<Student>() {  
  61.             {  
  62.                 int i = 0;  
  63.                 while (i++ < 10) {  
  64.                     Student student = new Student(i, "201200" + i, "name_" + i);  
  65.                     this.add(student);  
  66.                 }  
  67.             }  
  68.         };  
  69.         return students;  
  70.     }  
  71. }  
Java程式碼  收藏程式碼
  1. public class Student {  
  2.     private int id;  
  3.     private String stuNo;  
  4.     private String name;  
  5.     public Student() {  
  6.     }  
  7.     public Student(int id, String stuNo, String name) {  
  8.         this.id = id;  
  9.         this.stuNo = stuNo;  
  10.         this.name = name;  
  11.     }  
  12.     public int getId() {  
  13.         return id;  
  14.     }  
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.     public String getStuNo() {  
  19.         return stuNo;  
  20.     }  
  21.     public void setStuNo(String stuNo) {  
  22.         this.stuNo = stuNo;  
  23.     }  
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.     @Override  
  31.     public String toString() {  
  32.         return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo  
  33.                 + "]";  
  34.     }  
  35. }  

相關推薦

如何正確刪除List元素

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

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

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

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

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

C#如何刪除List集合的資料

在搜尋該問題之前我想你一定已經用過foreach遍歷並Remove的操作,突然發現報出了 集合已修改;可能無法執行列舉操作的異常。 我這裡給大家提供四種方式遍歷刪除資料: 第一種是模仿阿里巴巴Java開發手冊1.4的刪除: 新貼出手冊中的內容: 發現C#裡並沒有

JAVA循環刪除list元素的方法總結

tor 循環 toolbar i++ 使用 修改 log span .get  印象中循環刪除list中的元素使用for循環的方式是有問題的,但是可以使用增強的for循環,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳

Java循環刪除list元素方法的總結

bar del mov als lis remove for for循環 技術 JAVA中循環遍歷list有三種方式for循環、增強for循環(也就是常說的foreach循環)、iterator遍歷。 1、for循環遍歷list for(int i=0;i<li

AVA循環刪除list元素

叠代 修改 註意 bre iterator 多個 lis div 如果 文章來源: https://www.cnblogs.com/pcheng/p/5336903.html JAVA中循環遍歷list有三種方式for循環、增強for循環(也就是常說的forea

JAVA循環刪除list元素的方法總結(跳格刪除問題解決)(轉)

今天 src log 觸發 導致 spi als exceptio spa  印象中循環刪除list中的元素使用for循環的方式是有問題的,但是可以使用增強的for循環,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳至

Java迴圈刪除List元素

Java中迴圈刪除List中元素 寫在開頭:最近在處理一個包裝類時候,把Mapper查詢到的資料暫存到了ArrayList中,後續做迴圈遍歷刪除操作的時候,當時採用了foreach迴圈,結果彈出了ConcurrentModificationException錯誤。於是乎就在部落格上找

JAVA將ResultSetList

今天在使用jstl標籤展示查詢結果時遇到一個小問題,即如何將ResultSet物件傳遞給前臺頁面。  在預設情況中我們在使用資料庫查詢時 Class.forName(dom.getDriver()); //載入MYSQL JDBC驅動程式 String url=dom.g

java使用Pattern類中和Matcher類進行查詢和替換

前言 無論是哪一門語言,我們總會用到正則表示式來進行字串的查詢和替換。Java中也不為過,我曾經寫過一個網頁---正則表示式線上測試。那時候,我還沒有開始學習Java,不知道Java支援正則表示式,所以我的第一個方案是想辦法將資料傳輸到後臺,然後利用Shell指令碼正則表示

服務營銷在企業競爭作用知道?有什麽辦法解決?

自動 思維 溝通 定時 桌面 需要 品牌 營銷管理 客服系統 “服務”是任何企業競爭客戶的重中之重,企業的競爭,說白了就是“服務”的競爭。 據了解,在影樓行業,一個新客戶的獲取成本是維護一個老客戶的5倍,企業的服務營銷就如同是一把“雙刃劍”,舞的好不好,關鍵在舞“劍”人有沒

刪除單鏈表

刪除單鏈表中值等於XXX的所有元素 不經意間看到了一個不同尋常的實現方法,覺得挺有意思,於是自己實現了一下,程式碼真的是簡單明瞭跑得還賊快! 好,現在先在腦海中想想,你會怎麼實現?這麼簡單,5秒鐘後,你想到了解決方案,於是你決定驗證你的思路,請繼續往下看   定義連結串列節點結構如下:

ES6的這些操作技巧

ES6出來已經有好幾年了,同時很多新特性可以被巧妙地運用在專案中。本文就講述ES6的這些操作技巧,你會嗎? 1. 強制要求引數 ES6提供了預設引數值機制,允許你為引數設定預設值,防止在函式被呼叫時沒有傳入這些引數。 在下面的例子中,我們寫了一個required()函式作為引

一套實用的滲透測試崗位面試題

轉自:http://www.test404.com/post-1419.html 1.拿到一個待檢測的站,你覺得應該先做什麼? 收集資訊whois、網站源IP、旁站、C段網站、伺服器系統版本、容器版本、程式版本、資料庫型別、二級域名、防火牆、維護者資訊另說...

Python|一道神奇的Python面試題

  小編無意間,看到這麼一道Python面試題:以下程式碼將輸出什麼? 更多Python視訊、原始碼、資料加群960410445免費獲取   腦中默默一想,這還用說麼,肯定是:   最後一看答案,竟然是:

一道神奇的Python面試題

開發十年,就只剩下這套架構體系了! >>>   

我發現很多人其實不用瀏覽器

不一定 .so 資料 for nic www ima .com 效率 大多數人的生活和工作離不開電腦,而用電腦基本上是離不開瀏覽器的。 1、你知道的別人不一定知道,反之亦然 用瀏覽器看新聞、查資料很簡單,但是很多人都不知道瀏覽器的另一個強大的功能。也就是今天我想給大家介

python 刪除正在for循環list正確做法

body dex 之前 遍歷 mov pri div clas 結果 先放一個python遍歷發生的異常: 1 ls =[1,2,3,4,5,6,7,8,9] 2 for i in ls: 3 print("i",i) 4 print("ls",ls) 5

[轉載]Java HashMap 如何正確刪除元素

轉載自 https://www.cnblogs.com/zhangnf/p/HashMap.html?utm_source=itdadao&utm_medium=referral Java HashMap 如何正確遍歷並刪除元素   (一)HashMap的遍歷