Java集合之List遍歷找到匹配元素刪除方法總結
問題:在我們使用java開發的過程中可能會遇到這樣的問題,刪除List集合中與已知元素
相同的所有元素;
比如下面這個需求:
刪除List集合中字串為“edf”的所有記錄
案例:
方案一:你可能回想到使用forEach遍歷,找到匹配的將其刪除
List<String> list =new ArrayList<String>();
list.add("abc");
list.add("edf");
list.add("edf");
list.add("qer");
list .add("zxc");
for (String str : list) {
if(str.equals("edf"))
list.remove(str);//java.util.ConcurrentModificationException
}
for (String string : list) {
System.out.println(string);
}
很高興的做完了,但是一執行報錯:java.util.ConcurrentModificationException,是不是很疑惑,這是怎麼回事呀?不要著急聽我慢慢解釋:在使用增強for迴圈的過程不能對元素進行刪除、修改、增加的操作等操作。
但是,如果操作一下,立刻break跳出,也是不會報錯的!
例如:
List<String> list =new ArrayList<String>();
list.add("abc");
list.add("edf");
list.add("edf");
list.add("qer");
list.add("zxc");
for (String str : list) {
if(str.equals("edf")){
list.remove(str);
break;
}
}
for (String string : list) {
System.out.println(string);
}
結果輸出:
abc
edf
qer
zxc
方法二:使用傳統for迴圈遍歷
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("edf");
list.add("edf");
list.add("qer");
list.add("zxc");
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.equals("edf")) {
list.remove(i);
}
}
for (String string : list) {
System.out.println(string);
}
輸出結果:
abc
edf
qer
zxc
你會發現,錯不是會報了。但是還有一個edf沒有被刪除,這是怎麼回事呢?
總結:你會發現如果兩個元素相鄰,則後面的那個元素不會被刪除,原因是因為當前面
的一個元素匹配成功後,執行刪除操作;刪除完成,則集合後邊的元素會自動前移,導致下次遍歷漏掉一個元素,所以少刪後面那個元素。
例如上面的案例:當遍歷到第二元素的時候,if條件為true,接下來刪除這個元素。此時i的值為1,但是list集合右面的元素會前移,也就是說以前的第三個元素(索引為2的元素)會到第二個元素(索引為1)的位置上。迴圈繼續i++,i的值為2,所以成功的跳過了。
解決辦法:進入判斷後,i減1
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("edf");
list.add("edf");
list.add("qer");
list.add("zxc");
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.equals("edf")) {
list.remove(i);
i--;
}
}
for (String string : list) {
System.out.println(string);
}
結果為:
abc
qer
zxc
成功刪除 !
方法三:使用api提供的方法list.iterator(),這個方法不會出現問題
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("edf");
list.add("edf");
list.add("qer");
list.add("zxc");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (str.equals("edf")) {
iterator.remove();
}
}
for (String string : list) {
System.out.println(string);
}
結果為:
abc
qer
zxc
刪除成功!
相關推薦
Java集合之List遍歷找到匹配元素刪除方法總結
問題:在我們使用java開發的過程中可能會遇到這樣的問題,刪除List集合中與已知元素 相同的所有元素; 比如下面這個需求: 刪除List集合中字串為“edf”的所有記錄 案例: 方案一:你可能回想到使用forEach遍歷,找到匹配的
Java集合之List常見操作
collect 定位 lastindex 索引 hot move 值對象 安排 ast 一.定義集合(Collection)是Java存儲對象常見的一種方式;集合中的各個對象最終存儲在類似數組[]中。那麽,為什麽有了數組還要用集合呢?因為,集合中的長度可變,所以不用一開始就
java集合之List總結
主要驗證一下List集合的常用操作: list中新增,獲取,刪除元素; 新增方法是:.add(e); 獲取方法是:.get(index); 刪除方法是:.remove(index); 按照索引刪除; .remove(Object o); 按照元素內容刪除;
java集合中的遍歷方法
java集合中的遍歷方法 一般在遍歷java集合的時候有三種方式:for-loop、增強for和iterator public static void forEnhancedMethod(){ for (String str: list){ System.o
深入理解Java集合之List
List筆錄List相較於set、map,是按照一定順序儲存,List主要分為3類,ArrayList, LinkedList和Vector。以下是List的結構圖,本文章重點講解ArrayList與LinkedList的底層實現原理。ArrayListArrayList採用
Java 集合之List 集合的新增方法順序分析以及add和addAll區別
本篇主要探討論證以下兩個問題: 一、List集合有一個特點就是元素有序,即元素的存入順序與其取出順序一致。 二、List集合的新增方法主要有add()和addAll()。那兩者的區別在哪呢 add()是將傳入的的引數作為當前 List 中d的一個專案(Item)來儲存,即
Java 集合 之 List 酒店房間管理例項
package com.hotel; import java.util.List; public class TestHotel { public static void main(String[] args) { //例項化酒店 Hotel h=new Ho
Java 集合之List 集合的刪除方法順序分析以及remove和removeAll區別
在上一篇 《Java 集合之List 集合的新增方法順序分析以及add和addAll區別》中已經分析過 對於List集合順序從前到後的分析論證,這裡將不再詳細分析 remove()方法的順序 此篇將就 remove()和removeAll()的區別分析 java的 Li
list遍歷的時候,刪除某個符合條件的元素
印象中迴圈刪除list中的元素使用for迴圈的方式是有問題的,但是可以使用增強的for迴圈,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳至文末。看總結。。 JAVA中迴圈遍歷list有三種方式for迴圈、增強for迴圈(也就是常說的forea
Java中遍歷Map的幾種方法總結
方法一 在for-each迴圈中使用entries來遍歷 這是最常見的並且在大多數情況下也是最可取的遍歷方式。在鍵值都需要時使用。 Map<Integer, Integer> map = new HashMap<Integer, Integer>
java集合之遍歷集合
java中List、Set、Map集合的遍歷方法總結 一.List集合遍歷 package resources.com.zhang.集合; import java.util.ArrayList; import java.util.Iterator; import java.ut
Map、List、Set在Java中的各種遍歷方法
try one out 循環 java light size i++ pre 一、Map的4種遍歷 Map<String, String> map = new HashMap<String, String>(); map.put("姓名", "
List集合三種遍歷方法
++ next string highlight gpo equal 方法 arraylist bject 一、通過叠代來遍歷List集合,可以刪除List集合中的元素。 import java.util.ArrayList; import java.util.Itera
java基礎筆記(9)----集合之list集合
類型安全 sta clas bsp i++ 效率 contains 有序 void 集合 對於集合的理解,集合是一個容器,用於存儲和管理其它對象的對象 集合,首先了解所有集合的父接口----collection 特點:存儲任意object元素 方法 boolean add(
thinking in java (十七) ----- 集合之List總結
List概括 首先回顧一下關係圖 Lsit是一個介面,繼承與Collection介面,它代表的是有序的佇列 AbstractList是一個抽象類,它繼承於AbstractCollection,AbstractList實現List介面中除了size(),get(
Java list遍歷方式
List<Integer> list = new ArrayList<Integer>(); for(int i=0;i<10000000;i++){ list.add(i); } Iterator it=list.iterator();
Java基礎系列(四十一):集合之List
前言 List是繼承自Collection的一個子介面,它提供了一個有序的集合,在這個集合中我們可以使用索引去獲取集合中的值,同時,我們也可以通過迭代器去訪問集合中的元素,第一種方法被稱為隨機訪問,因為我們可以按照任意的順序去訪問元素,而使用迭代器就必須順序的去訪問元素。 結構圖
java-se-集合之List
List:列表 此介面對應的實現類的特點都是:有序的、可重複的(重複與否與元素的equals()方法有關) 常用方法: void add(int index, E element)
Java基礎之List集合(包含JUC)學習程序(一)
Java中重要的集合包主要有Collection和map 複習collectioon,主要是List,Queue和Set List 首先要知道List是一個介面,繼承自collection 其中定義了是元素有序並且可以重複的集合,被稱為序列,並且List允許存放
java集合系列——List集合之ArrayList介紹(二)
一:List概述 List是 java.util包下面的類,從 java集合系列——java集合概述(一) 中可以知道,List繼承了Collection 介面! List本身也是一個介面,它的實現有ArrayList 、LinkedList、Vector和CopyOn