2017-03-04 94 views
0

我遇到了很多關於ArrayLists的信息,以及如何操縱它們,但沒有任何東西似乎回答我的問題。使用java中的另一個ArrayList更新ArrayList

我想檢查一個arraylist中的元素是否沒有活動,如果是這樣的話,請將其移除但將另外2個添加到列表中。通常很容易,除非我需要將更改添加到另一個包含第一個數組列表中所有元素以及其他外部數組列表元素的數組列表。

我認爲Id能做到這一點使用一個臨時數組列表如下圖所示:

import java.util.ArrayList; 

public class main { 

    public static ArrayList<String> changedArr = new ArrayList(){ {add("M1"); add("alive"); add("M3");} }; 
    public static ArrayList<String> tempArr = new ArrayList(); 
    public static ArrayList<String> totalArr = new ArrayList(){ {add("M1"); add("alive"); add("M3"); add("L4"); add("S5");} }; 

    public static void main(String[] args) { 

     System.out.println("changedArray = "+changedArr); 
     System.out.println("tempArray = "+tempArr); 
     System.out.println("totalArray = "+totalArr); 

     for(Object a : changedArr){ 
      if(a !="alive") { 
       tempArr.clear(); 
       changedArr.remove(a); 
       totalArr.remove(a); 
       tempArr.add("S6"); 
       tempArr.add("S7"); 
       changedArr.addAll(tempArr); 
       totalArr.addAll(tempArr); 
      } 
     } 
     System.out.println("\nchangedArray = "+changedArr); 
     System.out.println("tempArray = "+tempArr); 
     System.out.println("totalArray = "+totalArr); 
    } 
} 

如果此代碼應返回:

changedArray = [M1, alive, M3] 
tempArray = [] 
totalArray = [M1, alive, M3, L4, S5] 

changedArray = [alive, S6, S7] 
tempArray = [S6, S7] 
totalArray = [alive, L4, S5, S6, S7] 

它,而不是返回:

Exception in thread "main" java.util.ConcurrentModificationException 
changedArray = [M1, M2, M3] 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 
tempArray = [] 
    at java.util.ArrayList$Itr.next(ArrayList.java:851) 
totalArray = [M1, M2, M3, L4, S5] 
    at main.main(main.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Process finished with exit code 1 

所以我的問題是,我做錯了什麼導致這些錯誤?這種方法可行嗎?如果沒有,我不明白爲什麼,你能解釋一下嗎?我怎麼能解決它?

如果你已經做到了這一點,感謝您花時間閱讀我的ramblings! :D

回答

1

您正在修改ArrayList changedArr,同時使用增強for循環對其進行迭代。這會導致拋出ConcurrentModificationException,因爲增強的for循環會產生循環發生的迭代器,並且迭代器會假定該列表在迭代器的生命週期中不會被修改。如果在迭代器遍歷它時修改列表,那麼您將得到ConcurrentModificationException。

一個解決方案將是有一個原始列表和一個副本,只修改副本。在迭代過程中,不應該修改列表。

0
for (Object a : changedArr) 

在列表上創建一個隱式迭代器。如果修改列表,則下一次迭代將失敗。

嘗試使用索引的循環法線。這應該可以幫助您解決例外問題

0

更改您這樣的代碼:

List<Object> copy = changedArr.stream().collect(Collectors.toList()); 

    for (Object a : copy) { 
     if (a != "alive") { 
      tempArr.clear(); 
      changedArr.remove(a); 
      totalArr.remove(a); 
      tempArr.add("S6"); 
      tempArr.add("S7"); 
      changedArr.addAll(tempArr); 
      totalArr.addAll(tempArr); 
     } 
    } 
0

一個ConcurrentModificationException被拋出,因爲你正在修改changedArr在遍歷它。迭代器注意到這些更改並引發異常。你能解決這個非常清晰而簡單的方法,是用ListIterator

ListIterator iterator = changedArr.listIterator(); 
while (iterator.hasNext()) { 
    Object a = iterator.next(); 
    if (a != "alive") { 
     iterator.remove(); // removes 'a' from changedArr 
     iterator.add("S6"); // adds "S6" to changedArr 
     iterator.add("S7"); 
     // etc. 
    } 
} 
0

非常感謝你的建議@Max Weinzierl,工作出色!我添加了一個'addedArr'數組作爲中間人使用。

任何人誰可能有類似的問題,這裏的重吉格舞碼:

import java.util.ArrayList; 

public class main { 

    public static ArrayList<String> changedArr = new ArrayList(){ {add("M1"); add("alive"); add("M3");} }; 
    public static ArrayList<String> addedArr = new ArrayList();//----- New ArrayList 'addedArr' used for adding the new elements 
    public static ArrayList<String> tempArr = new ArrayList(); 
    public static ArrayList<String> totalArr = new ArrayList(){ {add("M1"); add("alive"); add("M3"); add("L4"); add("S5");} }; 

    public static void main(String[] args) { 
     tempArr.addAll(changedArr);//--------------------------------- Duplicated changedArr 
     System.out.println("addedArray = "+addedArr); 
     System.out.println("tempArray = "+tempArr); 
     System.out.println("changedArray = "+changedArr); 
     System.out.println("totalArray = "+totalArr+"\n"); 
     int counter = 0;//-------------------------------------------- Counter to increment the added elements 

     for(Object a : changedArr){ 
      addedArr.clear();//--------------------------------------- Make sure 'addedArr' is cleared at start of each loop 
      if(a !="alive") { 
       tempArr.remove(a); 
       totalArr.remove(a); 
       addedArr.add("S"+(6+counter)); 
       counter++; 
       addedArr.add("S"+(6+counter)); 
       counter++; 
       tempArr.addAll(addedArr);//--------------------------- Adds new elements to tempArr to be added to changedArr 
       totalArr.addAll(addedArr);//-------------------------- Adds new elements to totalArr 
      } 
      System.out.println("addedArray = "+addedArr); 
     } 
     changedArr.clear();//----------------------------------------- Clear changedArr to make sure that anything removed in the loop is removed 
     changedArr.addAll(tempArr);//--------------------------------- Add all changes from tempArr to changedArr 
     System.out.println("\ntempArray = "+tempArr); 
     System.out.println("changedArray = "+changedArr); 
     System.out.println("totalArray = "+totalArr); 
    } 
} 
相關問題