2017-06-02 5 views
0

Ich baue eine App in Android Studio mit verschiedenen Baum- und Strauchpräferenzen und Checkboxen. Sie aktivieren ein Kästchen, das anzeigt, dass Sie einen Baum mit einem bestimmten Merkmal wünschen, und der Code wird durch eine Arraylist aller Bäume und Sträucher im Inventar geführt (ich habe eine Plant-Klasse mit Attributen wie Größe, Name, Frucht usw. erstellt) und fügt alle String-Namen von Objekten, die diesen Kriterien entsprechen, einer anderen Arraylist von zu druckenden Strings ("Selektionen" genannt) auf einem anderen Bildschirm hinzu (Duplikate werden vor dem Drucken in einem anderen Schritt eliminiert).Wie Objekte während der Iteration aus Arraylist entfernen?

Das Problem besteht darin, Objekte während der Iteration aus einer Arraylist zu entfernen. Hier ist ein Beispiel:

if (cb_s.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "s"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    } 
    if (cb_m.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "m"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    } 
    if (cb_l.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "l"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    }  

Für jedes Kontrollkästchen aktiviert, läuft es durch eine Arraylist namens ‚Test‘ die Pflanzen herausgreifen, die auf das entsprechende Kästchen entsprechen (in diesem Fall, werden diese drei Blöcke würde herausgreifen klein, mittel , und große Pflanzen - s, m, und l) und fügt sie zu einem anderen arraylist von Zeichenketten hinzu, um später gedruckt zu werden. Es entfernt auch Pflanzen aus der ersten Arraylist, Test, so dass sie nicht verglichen werden können, wenn andere Kontrollkästchen aktiviert sind (dies würde zu einer endgültigen Liste von Pflanzen führen, die nicht alle mit Checkboxen ausgewählten Kriterien erfüllen).

Java mag nicht die Art, wie ich versuche, Elemente aus der Arraylist 'Test' zu entfernen, da das ist, was ich durchlaufen werde. Was wäre der richtige Weg, um Objekte während der Iteration zu entfernen, wenn sie die Kriterien nicht erfüllen? Ich habe gehört, dass ich den Iterator der tatsächlichen Sammlung verwenden sollte? Wie würde ich das für diesen Code tun?

Danke!

+0

Mögliches Duplikat von [Iterieren durch eine Sammlung, Vermeiden von ConcurrentModificationException beim Entfernen in Schleife] (https://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re) – ashbygeek

Antwort

1

nicht vergleichen String mit == Methode, aber tun Sie es mit .equals in allen Fällen, zum Beispiel

p.getSize().equals("s") 

statt

p.getSize() == "s" 
0

Wenn Sie Elemente aus einer Liste entfernen möchten während über die Liste iterieren sollten Sie die iterator für diesen Einsatz:

Iterator<Plant> iterator = test.iterator(); 
while (iterator.hasNext()) { 
    p = iterator.next(); 
    if(p.getSize().equals("l")){ 
     selection.add(p.getName()); 
    } else { 
     selection.remove(p.getName()); 
     iterator.remove(); 
    } 
} 

Sie sollten auch String mit der equals Methode vergleichen. == überprüft, ob die Objekte die gleiche Instanz sind, während equals nach dem gleichen Inhalt in den Strings sucht.

Verwandte Themen