Der Java-Entwurf der "erweiterten for-Schleife" sah vor, den Iterator nicht für den Code freizugeben, aber die einzige Möglichkeit, ein Element sicher zu entfernen, ist der Zugriff auf den Iterator. In diesem Fall müssen Sie es also auf die alte Weise machen:
for(Iterator<String> i = names.iterator(); i.hasNext();) {
String name = i.next();
//Do Something
i.remove();
}
Wenn sich die erweiterte for-Schleife im echten Code wirklich lohnt, könnten Sie die Elemente zu einer temporären Sammlung hinzufügen und removeAll für die Liste nach der Schleife aufrufen.
EDIT (re addendum): Nein, die Liste in irgendeiner Weise außerhalb der iterator.remove()-Methode während der Iteration zu ändern wird Probleme verursachen. Die einzige Möglichkeit, dies zu umgehen, ist die Verwendung einer CopyOnWriteArrayList, aber das ist wirklich für Gleichzeitigkeitsprobleme gedacht.
Der billigste Weg (in Bezug auf die Anzahl der Codezeilen), um Duplikate zu entfernen, besteht darin, die Liste in ein LinkedHashSet (und dann wieder in eine Liste, falls erforderlich) zu übertragen. Dadurch wird die Einfügereihenfolge beibehalten, während Duplikate entfernt werden.
34 Stimmen
Kein guter Plan. Nur weil die Sprache es bei einem bestimmten Lauf toleriert, ist es noch lange keine gute Idee.
0 Stimmen
Sie müssen mich in einer schlechten Stimmung erwischt haben, aber mir scheint, die Antwort auf diese Frage kommt direkt aus der foreach-Dokumentation.
2 Stimmen
stackoverflow.com/questions/223918/
1 Stimmen
Als Alternative könnten Sie in Erwägung ziehen, Ihre Sammlung nicht direkt zu ändern, sondern einen Filter-Kombinator wie Guavas Iterables#filter zu verwenden: code.google.com/p/guava-libraries/wiki/FunctionalExplained Achten Sie auf sein träges Verhalten!
0 Stimmen
Wollten Sie wirklich fragen, ob Sie
Collection
speziell, anstattList
die Sie in Ihrem Code verwenden? Wenn Sie beabsichtigen, nach folgenden Punkten zu fragenList
und nichtCollection
dann bearbeiten Sie diese Frage bitte entsprechend - dann wäre diese Frage kein Duplikat! (Ein großer Unterschied vonList
gegenCollection
ist dasList
enthältget
in seiner Schnittstelle, währendCollection
nicht).0 Stimmen
Sie können die removeIf-Methode verwenden. Beispiel: sockets.removeIf(Socket::isClosed);