[JAVA] Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden

Ich bin heute abgestürzt, also werde ich es als Notiz hinterlassen

Quellcode, der abstürzt


fun releaseGroupItem(uri: Uri){

        var i = 0
        selectImageList.forEach {
            if (it.imageUri == uri){
                selectImageList.removeAt(i)
            }
            i++
        }

        val adapter = SelectImageFragmentAdapter(supportFragmentManager, selectImageList)
        select_image_pager.adapter = adapter
        indicator_default.setViewPager(select_image_pager)
}

Dies führt zu einem Absturz mit "java.util.ConcurrentModificationException", wenn diese Methode nacheinander aufgerufen wird.

Dies ist eine bekannte Geschichte in Java, und ich bin normalerweise süchtig danach, wenn ich gerade mit dem Programmieren beginne. (Ich habe bereits Code geschrieben, der dieses Phänomen nach 2 Jahren Android verursacht ...)

~~ Wenn die Ursache ArrayList # remove ist, wird sie unter Berücksichtigung der Reihenfolge der Liste nicht gelöscht. Es ist unten schön zusammengefasst. ~~ (unten hinzugefügt) http://programming-study.com/technology/java-list-remove/

Code, der nicht abstürzt


fun releaseGroupItem(uri: Uri){

        val iterator = selectImageList.iterator()
        while (iterator.hasNext()){
            val removeUri = iterator.next()
            if (removeUri.imageUri == uri) {
                iterator.remove()
            }
        }

        val adapter = SelectImageFragmentAdapter(supportFragmentManager, selectImageList)
        select_image_pager.adapter = adapter
        indicator_default.setViewPager(select_image_pager)
    }

Verwenden Sie "Iterator". Es scheint, dass dieser eine bessere Leistung hat, daher ist es möglicherweise besser, "Iterator" zu verwenden, außer dass das zu löschende Element einfach ist und nur einmal aufgerufen wird.

Es ist ein leerer Artikel, aber ich werde ihn als persönliche Notiz hinterlassen.

* Ergänzung

Ich habe es dir im Kommentarbereich gesagt!

https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html

Es scheint, dass Sie mit dem Iterator einfach Elemente in der Liste in der for-Anweisung hinzufügen und entfernen können, aber ArrayList löst dabei eine Ausnahme aus.

Danke für den Unterricht!

Recommended Posts

Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
Wenn Sie die Methode außerhalb verwenden möchten
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Verwendung der Getter / Setter-Methode (in Objektorientierung)
Ich möchte eine andere Desinfektionsmethode als Ansicht verwenden.
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Verwendung der link_to-Methode
Verwendung der include? -Methode
Verwendung der Methode form_with
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
[Schienen] Verwendung der Kartenmethode
[Java] Verwendung der toString () -Methode
Ich möchte @Autowired in Servlet verwenden
Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Wenn Sie InputStream in JDBI3 binden möchten
Ausgabe der Verwendung der Slice-Methode
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
Verwendung der replace () -Methode (Java Silver)
Ich möchte den Wert in Ruby erhalten
[Ruby-Grundlagen] Verwendung der Slice-Methode
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
Ich möchte Combine auch in UIKit verwenden.
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Ich möchte eine TraceId in das Protokoll einbetten
Ich möchte auch in Laradock Fischschalen verwenden! !!
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte ein kleines Symbol in Rails verwenden
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Ich möchte die Hauptmethode mit Reflektion aufrufen
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
[Grober Kommentar] Ich möchte die Zupfmethode heiraten
Notiz, die zum Anmeldebildschirm übergeht, wenn Sie nicht mit devise angemeldet sind
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
[Anfänger] Ich möchte die Migrationsdatei ändern.
Verwenden Sie collection_select, um die in Active_Hash gespeicherten Daten abzurufen
Was tun, wenn die Methode in f: ajax nicht gefunden wurde?
[Android, Java] Praktische Methode zur Berechnung der Differenz in Tagen
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ich möchte eine Methode aufrufen und die Nummer zählen
Dinge, die Sie häufig bei der Webentwicklung mit Java verwenden
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten