1. 簡介java
有時候須要在集合遍歷過程當中進行增/刪,下面介紹幾種正確的操做方式。spa
2. 示例code
例若有以下集合[1, 2, 2, 3, 5],須要刪除被2整除的元素。blog
1 import java.util.*; 2 3 public class ListFunc2 { 4 5 public static void main(String[] args){ 6 String str = "12235"; 7 String[] arr = str.split(""); 8 List<String> list1 = new ArrayList<>(Arrays.asList(arr)); 9 List<String> list2 = new ArrayList<>(Arrays.asList(arr)); 10 List<String> list3 = new ArrayList<>(Arrays.asList(arr)); 11 List<String> list4 = new ArrayList<>(Arrays.asList(arr)); 12 List<String> list5 = new ArrayList<>(Arrays.asList(arr)); 13 List<String> list6 = new ArrayList<>(Arrays.asList(arr)); 14 15 System.out.println(list1); // [1,2,2,3,5]
2.1 正序方式索引
從集合的第一個元素開始遍歷:rem
1 // 正序方式 2 for(int i=0; i<list2.size(); i++){ 3 int value = Integer.parseInt(list2.get(i)); 4 if(value%2==0){ 5 list2.remove(i); 6 } 7 } 8 System.out.println(list2); // [1, 2, 3 ,5]
發現未徹底刪除能夠被2整除的元素,緣由以下:當i=1時刪除第二個元素2,此時後面的元素會前移;然而下次遍歷時索引i=2,get
對應的元素爲3,跳過了原集合中的第三個元素2。it
0 1 2 3 4 // index 1 2 2 3 5 1 2 3 5
此時嘗試對索引進行修正,將索引從新指向原集合的第三個元素:class
1 for(int i=0; i<list3.size(); i++){ 2 int value = Integer.parseInt(list3.get(i)); 3 if(value%2==0){ 4 list3.remove(i); 5 i--; // 修正 6 } 7 } 8 System.out.println(list3); // [1, 3, 5]
2.2 逆序方式import
從集合的最後一個元素開始向前遍歷:
1 // 逆序方式 2 for(int i= list4.size()-1; i>=0; i--){ 3 int value = Integer.parseInt(list4.get(i)); 4 if(value%2==0){ 5 list4.remove(i); 6 } 7 } 8 System.out.println(list4); // [1, 3, 5]
索引和集合的對應變化過程以下:
當索引爲2時,刪除集合中的第三個元素2,此時集合中的後續元素前移;而後索引變爲1,刪除集合中的第二個元素2;
能夠發現,後續元素的前移不會致使索引的跳躍,不影響前面的元素。
0 1 2 3 4 // index 1 2 2 3 5 1 2 3 5
2.3 Iterator方式
推薦使用Iterator對遍歷過程當中的集合進行修改,不用擔憂索引的跳躍和越界狀況。
1 // iterator迭代器 2 for(Iterator<String> it = list5.iterator(); it.hasNext();){ 3 int value = Integer.parseInt(it.next()); 4 if(value%2==0){ 5 it.remove(); 6 } 7 } 8 System.out.println(list5); // [1, 3, 5] 9 10 Iterator<String> it = list6.iterator(); 11 while(it.hasNext()){ 12 int value = Integer.parseInt(it.next()); 13 if(value%2==0){ 14 it.remove(); 15 } 16 } 17 System.out.println(list6); // [1, 3, 5]
2.4 Java 8 新特性
直接使用boolean removeIf(Predicate<? super E> filter)方法
1 // java 8最新方法 2 list1.removeIf(v->Integer.parseInt(v)%2==0); // v表示集合中的元素,給出適當條件過濾 3 System.out.println(list1); // [1, 3, 5]
!!!