java 動態增/減集合元素

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]

!!!

相關文章
相關標籤/搜索