| 

.NET C# Java Javascript Exception

Antwort #A854 zur Frage #F228: Wie verhält sich die for-Schleife, wenn aus der itererierten Collection ein Element entfernt wird?



Version 6
10.09.2009 00:12:36
Dies ist die aktuelle Version
Hallo,

EDIT: Hatte leider etwas zu viel Code aus der Antwort von cowabunga (die Liste vor dem iterieren kopieren) kopiert, so das alles was ich in der Original-Version sagte unnütz war. Hier die korrigierte Version (danke auch an Andreas für den subtilen Hinweis *g*). Es gibt wohl keine andere Wahl als den Iterator direkt zu verwenden.

import java.util.*;

public final class RandomListTest {
public static void main(String[] args) {
List<String> stringList =
new ArrayList<String>(Arrays.asList("a", "hallo", "b"));

for(Iterator<String> i=stringList.iterator(); i.hasNext();) {
String str = i.next();
System.out.printf("found element: %s\n", str);
if (str.equals("hallo")) {
i.remove();
}
}

System.out.println(stringList);
}
}



Die Ausgabe ist dann so:
found element: a
found element: hallo
found element: b
[a,b]
weissi 101 1 2
Version 5
10.09.2009 00:12:36
Hallo,

wenn du das tun willst, brauchst du eine Liste, die man während dem Iterieren verändern darf, dazu kannst du die Liste mit
Collections.synchronizedList(list)
synchronisiert machen.

Beispiel-Code kannst du hier sehen:
import java.util.*;

public final class RandomListTest {
public static void main(String[] args) {
List<String> stringList = Collections.synchronizedList(
new ArrayList<String>(Arrays.asList("a", "hallo", "b")));

for(String str: stringList) {
System.out.printf("found element: %s\n", str);
if (str.equals("hallo")) {
stringList.remove(str);
}
}

System.out.println(stringList);
}
}



Die Ausgabe ist dann so:
found element: a
found element: hallo
[a,b]


EDIT: Hatte leider etwas zu viel Code aus der Antwort von cowabunga kopiert, so das alles was ich sagte in der Original-Version unnütz war ;-). Hier die korrigierte Version (danke auch an Andreas für den subtilen Hinweis *g*)
weissi 101 1 2
Version 4
10.09.2009 00:11:06
Hallo,

wenn du das tun willst, brauchst du eine Liste, die man während dem Iterieren verändern darf, dazu kannst du die Liste mit
Collections.synchronizedList(list)
synchronisiert machen.

Beispiel-Code kannst du hier sehen:
import java.util.*;

public final class RandomListTest {
public static void main(String[] args) {
List<String> stringList = Collections.synchronizedList(
new ArrayList<String>(Arrays.asList("a", "hallo", "b")));

for(String str: stringList) {
System.out.printf("found element: %s\n", str);
if (str.equals("hallo")) {
stringList.remove(str);
}
}

System.out.println(stringList);
}
}



Die Ausgabe ist dann so:
found element: a
found element: hallo
[a,b]


EDIT: Hatte leider etwas zu viel Code aus einer anderen Aufgabe kopiert, so das alles was ich sagte in der Original-Version unnütz war ;-). Hier die korrigierte Version (danke auch an Andreas für den subtilen Hinweis *g*)
weissi 101 1 2
Version 3
09.09.2009 17:47:44
Hallo,

wenn du das tun willst, brauchst du eine Liste, die man während dem Iterieren verändern darf, dazu kannst du die Liste mit
Collections.synchronizedList(list)
synchronisiert machen.

Beispiel-Code kannst du hier sehen:
import java.util.*;

public final class RandomListTest {
public static void main(String[] args) {
List<String> stringList = Collections.synchronizedList(
new ArrayList<String>(Arrays.asList("a", "hallo", "b")));

for(String str: new LinkedList<String>(stringList)) {
System.out.printf("found element: %s\n", str);
if (str.equals("hallo"))
stringList.remove(str);
}

System.out.println(stringList);
}
}



Die Ausgabe ist dann so:
found element: a
found element: hallo
found element: b
[a,b]


HTH
weissi 101 1 2
Version 2
09.09.2009 17:43:51
Hallo,

wenn du das tun willst, brauchst du eine Liste, die man während dem Iterieren verändern darf, das kannst du z.B. so erreichen:

import java.util.*;

public final class RandomListTest {
public static void main(String[] args) {
List<String> stringList = Collections.synchronizedList(
new ArrayList<String>(Arrays.asList("a", "hallo", "b")));

for(String str: new LinkedList<String>(stringList)) {
System.out.printf("found element: %s\n", str);
if (str.equals("hallo"))
stringList.remove(str);
}

System.out.println(stringList);
}
}



Die Ausgabe ist dann so:
found element: a
found element: hallo
found element: b
[a,b]
weissi 101 1 2
Version 1
09.09.2009 17:42:24
Hallo,

wenn du das tun willst, brauchst du eine Liste, die man während dem Iterieren verändern darf, das kannst du z.B. so erreichen:


Die Ausgabe ist dann so:
weissi 101 1 2