Element aus Liste entfernen

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Hallo,

folgende Konstruktion. Ich will etwas aus einer Liste filtern und dass es keien ConcurrentModificationException bekomme fallen mir folgende 3 möglichkeiten ein.
Welche ist die beste und warum?

1. Variante
Java:
    public List<String> filter(List<String> values) {
         List<String> result = new ArrayList<String>(values);

        for(Iterator<String> it = result.iterator(); it.hasNext(); ) {
            String s= it.next();
            if(checkString(s)) {
                it.remove();
            }
        }

        return result;
    }

Ja ich hab das mal in nem java magazin gelesen, dass diese variante nicht so gut ist weiß aber nimmer warum?!?!?!

2.Variante
Java:
public List<String> filter(List<String> values) {
         List<String> result = new CopyOnWriteArrayList<String>();
         result.addAll(values);

         for (String s: result) {
            if (checkString(s) {
                 result.remove(s);
             }
        }

        return result;
     }
Weiß nicht ob das Perfomance technisch optimal ist

3.Variante
Java:
public List<String> filter(List<String> values) {
       List<String> result = new ArrayList<String>(values);

       List tmpList = new ArrayList<String>();

          for(String s: result){
             if( checkString(s)) {
                 tmpList.add(s);
             }
          }

        result.removeAll(tmpList);
 

Kaffeebohn

Bekanntes Mitglied
Hallo SirWayne,

Bei der ersten Möglichkeit (it.remove()) ist der Iterator ja genau dafür ausgelegt. Ich kenne bisher keinen Grund, wieso man das nicht einsetzen sollte, lasse mich aber gerne belehren.

Wenn du vorher eine Kopie der Liste anfertigst, solltest du dir je nach Liste Gedanken um die Performance machen.
 

FArt

Top Contributor
Ich würde als ersten Ansatz die konkurrierenden Zugriffe einfach synchronisieren. Nur bei Bedarf würde ich andere Varianten in Erwägung ziehen, dann abhängig davon, wo denn eigentlich Probleme auftreten.

Merke: pauschale Lösungen passen nicht auf individuelle Probleme; eine gute Lösung hängt immer vom Zugriffsverhalten auf die Liste ab. Wird viel gefiltert? Viele schreibende Zugriffe? Viele lesene Zugriffe? Mehr schreibende als lesende Zugriffe? Große Listen?
 

Marco13

Top Contributor
Auf jeden Fall ist die zweite IMHO die unsinnigste... Man könnte sich auch sowas vorstellen wie
Code:
    public List<String> filter(List<String> values) 
    {
        List<String> result = new ArrayList<String>();
 
        for(String s : values) 
        {
            if(!checkString(s)) 
            {
                result.add(s);
            }
        }
        return result;
    }
... so würd' ich's wahrscheinlich machen...
 

Landei

Top Contributor
Da man nicht sicher wissen kann, ob ein Iterator überhaupt remove implementiert, bereiten mir Lösungen wie oben etwas Bauchschmerzen. Ich lösche deshalb normalerweise indexbasiert, und zwar rückwärts, damit ich keine Probleme mit dem "Nachrutschen" bekomme:

Java:
for(int i = list.size()-1; i >= 0; i--) {
   if(condition()) { 
     list.remove(i); 
  }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
B flying-saucer-pdf Element vertikal strecken Allgemeine Java-Themen 0
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
S Link element an vorletzte stelle einfügen Allgemeine Java-Themen 2
I DOM-Parser - Element im Element an bestimmten Stellen auslesen Allgemeine Java-Themen 1
B DomParser - Element filtern Allgemeine Java-Themen 4
S Iterable<?> anzahl der Element Allgemeine Java-Themen 14
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
KeVoZ_ JSoup - Website Inhalt/Element mit String vergleichen Allgemeine Java-Themen 2
Messoras List zeigt nur das letzte Element an Allgemeine Java-Themen 14
G mittleres Element aus TreeMap Allgemeine Java-Themen 5
J XML Element Zugriff Allgemeine Java-Themen 4
S translate verschiebt verkehrtes Element Allgemeine Java-Themen 2
M Webservices: WSDL Files ohne "Service" Element? Allgemeine Java-Themen 4
P Element toString Allgemeine Java-Themen 9
J Element aus HashSet löschen Allgemeine Java-Themen 2
S Element aus ArrayListe löschen --> Thread hängt sich auf Allgemeine Java-Themen 2
E Blob Element kopieren Allgemeine Java-Themen 12
B von Array-Element auf Position in Array Allgemeine Java-Themen 7
M Javadoc | Javadoc Eintrag des verlinkten Element einbetten? Allgemeine Java-Themen 4
A Element für Preferences Page Allgemeine Java-Themen 3
T Element aus Vector entfernen Allgemeine Java-Themen 4
J Tree indexieren, Element-Indexierung Allgemeine Java-Themen 2
A Queue, beim dem das letzte Element herausfällt Allgemeine Java-Themen 4
I ArrayList mit einem aktiven Element Allgemeine Java-Themen 7
M Wie heißt denn dieses grafische Element ? Allgemeine Java-Themen 2
K Kein schließendes Tag bei leerem Element mit JDOM Allgemeine Java-Themen 8
E JTree - einzelnes Element (Knoten) editieren Allgemeine Java-Themen 2
B JList Element Auswahl Allgemeine Java-Themen 2
N Array Element vom Typ eines Objekts zeigt auf ein anderes A. Allgemeine Java-Themen 4
Ark Kubische Suche um ein Element in array[][][] Allgemeine Java-Themen 18
D Fehler beim löschen eines Arraylist-element Allgemeine Java-Themen 5
M Erstes Element einer Enumeration ermitteln Allgemeine Java-Themen 6
N Element aus LinkedList löschen Allgemeine Java-Themen 2
C Collection Element ersetzen Allgemeine Java-Themen 5
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 23
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben