List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
for(String str: stringList) {
if (str.equals("hallo"))
stringList.remove(str);
}
|
List<String> blubb = new LinkedList<String>();
blubb.add("abc");
blubb.add("def");
Iterator<String> it = blubb.iterator();
while(it.hasNext()){
String current = it.next();
if (current.equals("abc")){
it.remove();
}
|
in dem fall nicht, aber es wird unnötigerweise die liste mindestens 2x iteriert.
– Andreas 10.09.2009
|
||
Die Lösung mit den Iteratoren ist gut, schade nur dass das for-Konstrukt aus Java1.5 keinen Zugriff auf den Iterator erlaubt, denn das for wird ja in eine Iteratorschleife umgewandelt.
Danke für den Hinweis mit der LinkedList. Ich vergesse die immer wieder, obwohl die grad für mein Programm die beste Implementierung wäre. @cowabunga1984: Du umgehst das Problem in dem du die Liste kopierst auf dieser iterierst und im Original löschst. Ist nicht so ganz effizient, wenn man ein paar tausend Objekte in der Liste hätte, aber würde durchlaufen. Dass 2x Iterieren sehe ich allerdings nicht... – pocketdevel 10.09.2009
|
||
Bei mir spielt die Performance oft eher eine untergeordnete Rolle. Meistens habe ich mich deshalb für die "kürzere" Variante entschieden. Falls es auf Performance ankommt, ist natürlich die Iterator-Lösung die bessere...
– cowabunga1984 10.09.2009
|
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);
}
}
found element: a
found element: hallo
found element: b
[a,b]
|
List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
for(int i = length - 1; i > -1; i--)
if (str.get(i).equals("hallo"))
stringList.remove(i);
|
Die Lösung scheint was Speicherverbrauch angeht, die beste zu sein, nur bei der Laufzeit muss man darauf achten, welche List-Implementierung genommen wird. ArrayList und Vector erlauben Wahlfreienzugriff mit konstanter Laufzeit (ungefähr o(1)), aber LinkedList lineare ( o(n) ).
– pocketdevel 10.09.2009
|
||
PS: Die Variante mit dem Iterator ist natürlich gleich gut beim Speicherverbrauch.
– pocketdevel 10.09.2009
|
List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
stringList.remove("hallo");
List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
while(stringList.remove("hallo"))
{}
|
|
List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
for(String str: new LinkedList<String>(stringList)) {
if (str.equals("hallo"))
stringList.remove(str);
}
|
Geht natürlich, aber die Effizienz ist nicht optimal (2. Liste und mit jedem stringList.remove(str) muss je nach Implementierung womöglich die gesamte Liste nach str nochmal durchsucht werden).
– pocketdevel 21.09.2009
|
|
List<String> stringList = new ArrayList<String>();
... //befüllen der Liste
List<String> toRemove = new ArrayList<String>();
for(String str: stringList) {
if (str.equals("hallo"))
toRemove.add(str);
}
stringList.removeAll(toRemove);
|
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> stringList = new ArrayList<String>();
stringList.add("Hallo");
stringList.add("Andreas");
stringList.add("FOOBAR");
stringList.add(":)");
for(String str: new ArrayList<String>(stringList)) {
if (str.equals("FOOBAR"))
stringList.remove(str);
}
System.out.println(stringList);
}
}[/code] erzeugt keine ConcurrentModificationException... ;)