在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條件。