2012-04-04 11 views
0

Mögliche Duplizieren:
Concurrent modification error when adding elements to LinkedListwie ConcurrentModificationException Fehler zu überwinden

Ich habe eine Arraylist von LinkedList

List<LinkedList<File1>> backup = new ArrayList<LinkedList<File1>>(); 

während der Laufzeit auf einen Knopf klicken i entfernen möchten einige Elemente aus einer Liste und die fügen sie in andere Liste. Ich habe versucht, auch die verknüpfte Liste erklärt als

List<LinkedList<File1>> lists = Collections.synchronizedList(new ArrayList<LinkedList<File1>>()); 

bt der Fehler gleich bleibt. Ich bin nicht in der Lage, den Fehler herauszufinden, ich bin auch neu in Java, also plz helfen. Mein Code ist wie folgt.

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           
     // When delete button is clicked 
     int parent_node = 0, d =0 ; 
     File1 srt[] ; 
     File1 deleted[] = new File1[no_node]; 
     Random randomGenerator = new Random(); 
     int rand_no = 0; 
     while(rand_no == 0) 
     { 
      rand_no = randomGenerator.nextInt(no_node); 
     } 
     System.out.println("random no : " + rand_no); 
     for(i=0;i<backup.size();i++) 
     {    
      ListIterator itr = it_bk.get(i); 
      while(itr.hasNext()) 
      { 
       File1 file = (File1) itr.next();     
       if(rand_no == file.nod) 
       {      
        parent_node = i; 
        itr.remove();      
       } 
      } 
      //iterating back 
      while(itr.hasPrevious()) 
       { 
        File1 file = (File1) itr.previous(); 
       }    
     } 

     System.out.println("Parent node:" + parent_node); 
     //add the nodes to parent 
     ListIterator itr1 = it_bk.get(rand_no); 

     System.out.println("randam node"); 

     while(itr1.hasNext()) 
     { 
      File1 file = (File1) itr1.next(); 
      deleted[d] = new File1(); 
      deleted[d] = file ; 
      d++; 
      //tmp_bk.add(file); 
      System.out.println("node :" + file.nod + "\tdist :" + file.dist); 
     } 

     LinkedList<File1> tmp_bk = backup.get(parent_node); 
     for(j=0;j<d;j++) 
     { 
      tmp_bk.add(deleted[j]); 
      System.out.println(deleted[j].nod + "\t" + deleted[j].dist); 
     } 
     //it_bk.add(tmp_bk.listIterator()); 
     ListIterator itr_p = it_bk.get(parent_node); 
     System.out.println("parent node"); 
      while(itr_p.hasNext()) 
     { 
      File1 file = (File1) itr_p.next(); 
      System.out.println("node :" + file.nod + "\tdist :" + file.dist); 
     } 

     }     
+0

Sie können eine Liste nicht ändern, während Sie darüber iterieren. Denk darüber nach. Du hast 5 Items und iterierst darüber, dann entfernst du 1 Item. Sie machen den Status der Liste inkonsistent. – zengr

Antwort

1

Sie werden durch die Liste durchlaufen und die gleiche Liste ändern, die nicht gültig ist,

itr.remove();  

statt zwei Liste verwalten und nach Iteration Wirkung der resultierenden Liste der Quellenliste gilt

+0

thnks viel für Ihre Antwort :) aber ich habe nicht ein Problem beim Entfernen der Elemente in der Liste. das ist der Grund, warum ich die Elemente in ein Array stelle und dann versuche, dort Elemente in eine andere Liste hinzuzufügen. – Divyashree

+0

thnks eine Menge :) seine Arbeit nw :) – Divyashree

+0

Sie sind herzlich willkommen :) (auch diese Antwort als akzeptiert zu markieren), wenn dies wirklich Ihre Frage beantwortet hat –

0

Der Fehler tritt auf, wenn Sie Objekte aus einer Liste entfernen, während darüber iterieren. Sie könnten die Elemente, die Sie entfernen möchten, in eine andere Liste einfügen und nach der Iteration über die erste rufen Sie einfach firstlist.removeAll(list_with_items_to_remove).

+1

Was kann mit einer Kopie der Liste und die Methoden removeAll erreicht werden (oder vielleicht retainAll in einigen Fällen) – keyser

+0

ok, wenn das das Problem ist, habe ich es entfernt. Jetzt füge ich Objekte nur noch zur verknüpften Liste hinzu und erhalte immer noch den gleichen Fehler. – Divyashree

+0

Sie können Objekte auch nicht in eine Liste einfügen, während Sie darüber iterieren. Wenn Sie die Iteration starten, müssen Sie berücksichtigen, dass die Liste für Einfügungen und Entfernungen gesperrt ist. All diese müssen nach der Iteration durchgeführt werden. Tun Sie dasselbe wie in meiner Antwort, aber verwenden Sie stattdessen firstlist.addAll (list_with_items_to_add). Wenn Sie wirklich die Liste während der Iteration ändern müssen, könnten Sie sich java.util.concurrent.ConcurrentLinkedQueue oder etwas ähnliches ansehen. Aber seien Sie sich bewusst, dass es nicht so schnell ist wie bei einer normalen Liste. –

Verwandte Themen