1. 程式人生 > >Java集合之List遍歷找到匹配元素刪除方法總結

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

JavaMap的幾種方法總結

方法一 在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