Java中List 刪除元素


在Java中,使用List時想要刪除某個特定個元素怎么辦?很好辦!因為List接口有remove()這個方法,我們只需要調用remove()方法,就可以刪除list中的某個元素。但是list自帶的有一些坑,在相鄰有相同元素時會掉坑:

使用list.remove()刪除:

 

 

我們看到有兩個“a”元素相鄰,但是刪除時卻只刪除了一個,這是為何呢?因為刪除時,每刪除一個元素,后邊的元素都會左移一位,也就是下標會減1,在for循環中,刪除第一個“a”時,i(下標)為0,此時list重排,后邊的元素全部左移1位,也就是說第二個“a”元素的下標從1變為了0,而此時for循環進行已經第二次循環了,執行了i++,i的值為1,對應為“b”元素,然后向后循環,再也找不到“a”元素了。所以相鄰元素有重復的話,只能刪除一個。這明顯不符合我們的需求。

那解決辦法是什么呢?

1.刪除后元素后,i-1

 

 

刪除一個元素后,后邊的元素左移1位,此時i-1,保證了下次循環能訪問到左移了1位的元素。

2.反向刪除

我們先從后邊的元素開始循環,一個一個的往前面循環,找出特定元素刪除

 

 

這樣,就算刪除了倒數第一個"a"元素,list重排,也只是把后邊的元素左移1位,此時倒數第一個“a”元素(下標為1)被刪除,接着b替代了a成為了下標為1的元素,但前邊的元素不變,i--  = 0 后依然能夠找到其相鄰的a元素。

3.使用迭代器刪除(iterator)(推薦)

 

 

 

Iterator.remove() 方法會在刪除當前迭代對象的同時,會保留原來元素的索引。所以用迭代刪除元素是最保險的方法,建議大家使用List過程,這其實和上面第一中方法類似,只不過iterator內部幫我們做了類似i-1的操作。推薦使用這種做法,因為我們不保證每次都記得手動把下標減去1。

4.賦值給新的list

其實我們可以轉換思維,可以過濾掉不需要的元素后賦值給新的list對象,利用java8的lambda表達式和強大的stream流形式進行內部迭代來過濾掉特定元素,我們只需一行代碼就可以實現。雖然這種方式比較簡潔,但是定義了新變量,舊的list就只能等待漫長的gc了。

注意:在進行普通for循環刪除時,不要把list.size()抽離出去賦值給變量,然后用此變量做為for條件, 因為刪除時,list.size()的值是會改變的,要把list.size作為for條件。

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM