In Java habe ich eine ArrayList von Strings wie:
[,Hi, ,How,are,you]
Ich möchte die null und leeren Elemente entfernen, wie man es so ändert, dass es so ist:
[Hi,How,are,you]
Niranjan Kumar
In Java habe ich eine ArrayList von Strings wie:
[,Hi, ,How,are,you]
Ich möchte die null und leeren Elemente entfernen, wie man es so ändert, dass es so ist:
[Hi,How,are,you]
List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
System.out.println(list);
list.removeAll(Arrays.asList("", null));
System.out.println(list);
Ausgabe:
[, Hi, null, How]
[Hi, How]
Gibt mir UnsupportedOperationException
aus java.util.AbstractList.remove()
…
– shkschneider
8. Juni 2015 um 16:00 Uhr
Verdammt, ich habe es nochmal gemacht und es funktioniert. Mein Fehler. Aufrichtig.
– shkschneider
9. Juni 2015 um 9:34 Uhr
Müssen wir aus der importieren util
oder awt
Bibliothek?
– Lakshya Goyal
23. Juli 2016 um 13:20 Uhr
Gibt es eine Möglichkeit, die Liste wieder in ein Array umzuwandeln? Und können wir die gleiche Anzahl von Positionen im Array wie zuvor beibehalten? Es würde einfach alle leeren Stellen ans Ende verschieben?
– Lakshya Goyal
23. Juli 2016 um 13:29 Uhr
@LakshyaGoyal Sie sagen, Google ist dein Freund – google.com/search?q=arraylist+to+array
– Sufian
26. Juli 2016 um 7:06 Uhr
tokhi
Es ist eine sehr späte Antwort, aber Sie können auch die verwenden Collections.singleton
:
List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
list.removeAll(Collections.singleton(null));
list.removeAll(Collections.singleton(""));
es gibt UnsupportedOperationException, nicht sicher, wie es für andere funktioniert
– Derick Daniel
23. Mai 2018 um 10:39 Uhr
@Derick Wenn Sie die Arrays.asList nicht mit new ArrayList
– Deepthi
24. Mai 2019 um 11:37 Uhr
Eine andere Möglichkeit, dies jetzt zu tun, da wir Java 8-Lambda-Ausdrücke haben.
arrayList.removeIf(item -> item == null || "".equals(item));
Mit Guava können Sie tun arrayList.removeIf(Strings::isNullOrEmpty);
.
– Schmosel
29. August 2016 um 20:46 Uhr
Oder mit Apache Commons arrayList.removeIf(StringUtils::isEmpty);
– Andreas Mairose
29. August 2016 um 20:50 Uhr
Oder wenn Sie auch Einträge entfernen möchten, die nur Leerzeichen sind arrayList.removeIf(StringUtils::isBlank);
– Andreas Mairose
29. August 2016 um 20:51 Uhr
Übrigens macht es keinen Sinn, den Yoda-Vergleich zu verwenden, sobald Sie nach null suchen.
– Schmosel
29. August 2016 um 20:53 Uhr
Java 11: arrayList.removeIf(String::isBlank);
– Schlimm
1. September 2020 um 15:42 Uhr
Der Jäger
Wenn Sie Java 8 verwenden, versuchen Sie dies mit dem Lambda-Ausdruck und org.apache.commons.lang.StringUtilsdas wird auch klar null
und blank
Werte ab array
Eingang
public static String[] cleanArray(String[] array) {
return Arrays.stream(array).filter(x -> !StringUtils.isBlank(x)).toArray(String[]::new);
}
ref – https://stackoverflow.com/a/41935895/9696526
nicht.gut.im.Codieren
Wenn Sie fragen wie Um die leeren Zeichenfolgen zu entfernen, können Sie dies folgendermaßen tun (where l
ist ein ArrayList<String>
) – das entfernt alles null
Referenzen und Strings der Länge 0:
Iterator<String> i = l.iterator();
while (i.hasNext())
{
String s = i.next();
if (s == null || s.isEmpty())
{
i.remove();
}
}
Verwechseln Sie nicht ein ArrayList
mit Arrays, ein ArrayList
ist eine dynamische Datenstruktur, die ihre Größe entsprechend ihrem Inhalt ändert. Wenn Sie den obigen Code verwenden, müssen Sie nichts tun, um das Ergebnis so zu erhalten, wie Sie es beschrieben haben – wenn Ihr ArrayList
war [“”,”Hi”,””,”How”,”are”,”you”]nach dem Entfernen wie oben, wird es genau das sein, was Sie brauchen – ["Hi","How","are","you"]
.
Wenn Sie jedoch muss haben eine ‘desinfiziert’ Kopieren der Originalliste (unter Beibehaltung des Originals wie es ist) und durch ‘speichern Sie es zurück‘ du meintest ‘eine Kopie machen‘, dann wird Ihnen der Code von krmby in der anderen Antwort gut dienen.
Es gibt keine magische Zero-Arg-Remove-Methode auf der Arratlist, wie Sie erwähnt haben.
– Kerem Baydogan
2. April 2011 um 2:38 Uhr
Bitte schauen Sie genauer hin – die remove()
wird auf einem aufgerufen Iterator
nicht auf ein ArrayList
– nicht.gut.im.Codieren
2. April 2011 um 2:42 Uhr
aus deiner Antwort wenn Sie remove() für die ArrayList aufgerufen haben
– Kerem Baydogan
2. April 2011 um 2:45 Uhr
Was Sie tun können, ist remove (“”) aufzurufen, wenn Sie nur alle leeren Zeichenfolgen entfernen möchten. Das funktioniert jedoch nicht für Zeichenfolgen mit nur Leerzeichen.
– squawknull
2. April 2011 um 2:48 Uhr
@krmby Bearbeitet, danke. @squaknull Neat, daran habe ich nicht gedacht (obwohl Sie es immer noch in einer Schleife tun müssen). Und es hängt davon ab, was das OP mit “leer” meint – ich habe einen Haftungsausschluss eingefügt, der darauf hinweist, dass diese Schleife alles entfernen wird null
und nur leere Zeichenfolgen.
– nicht.gut.im.Codieren
2. April 2011 um 2:52 Uhr
Sam Beere
Werde dieses kleine Nugget hier reinwerfen:
Stream.of("", "Hi", null, "How", "are", "you")
.filter(t -> !Strings.isNullOrEmpty
.collect(ImmutableList.toImmutableList());
Ich wünschte von ganzem Herzen, dass Java eine hätte filterNot
.
Es gibt keine magische Zero-Arg-Remove-Methode auf der Arratlist, wie Sie erwähnt haben.
– Kerem Baydogan
2. April 2011 um 2:38 Uhr
Bitte schauen Sie genauer hin – die remove()
wird auf einem aufgerufen Iterator
nicht auf ein ArrayList
– nicht.gut.im.Codieren
2. April 2011 um 2:42 Uhr
aus deiner Antwort wenn Sie remove() für die ArrayList aufgerufen haben
– Kerem Baydogan
2. April 2011 um 2:45 Uhr
Was Sie tun können, ist remove (“”) aufzurufen, wenn Sie nur alle leeren Zeichenfolgen entfernen möchten. Das funktioniert jedoch nicht für Zeichenfolgen mit nur Leerzeichen.
– squawknull
2. April 2011 um 2:48 Uhr
@krmby Bearbeitet, danke. @squaknull Neat, daran habe ich nicht gedacht (obwohl Sie es immer noch in einer Schleife tun müssen). Und es hängt davon ab, was das OP mit “leer” meint – ich habe einen Haftungsausschluss eingefügt, der darauf hinweist, dass diese Schleife alles entfernen wird null
und nur leere Zeichenfolgen.
– nicht.gut.im.Codieren
2. April 2011 um 2:52 Uhr
Es gibt ein paar Ansätze, die Sie verwenden könnten:
Iterieren Sie über die Liste und rufen Sie auf Iterator.remove()
für die Listenelemente, die Sie entfernen möchten. Das ist am einfachsten.
Immer wieder anrufen List.remove(Object)
. Das ist auch einfach, aber am schlechtesten … weil Sie das wiederholt scannen gesamte Liste. (Dies könnte jedoch eine Option für eine veränderliche Liste sein, deren Iterator dies nicht unterstützt remove
… aus irgendeinem Grund.)
Erstellen Sie eine neue Liste, durchlaufen Sie die alte Liste und fügen Sie Elemente, die Sie behalten möchten, zu einer neuen Liste hinzu.
Wenn Sie die neue Liste nicht zurückgeben können, wie unter 3. oben, löschen Sie dann die alte Liste und verwenden Sie sie addAll
um die Elemente der neuen Liste wieder hinzuzufügen.
Welche davon am schnellsten ist, hängt von der Klasse der ursprünglichen Liste, ihrer Größe und der Anzahl der zu entfernenden Elemente ab. Hier sind einige der Faktoren:
Für ein ArrayList
jeder Einzelne remove
Betrieb ist O(N)
wo N
ist die Listengröße. Es ist teuer, mehrere Elemente aus einer großen ArrayList mit dem zu entfernen Iterator.remove()
Methode (bzw ArrayList.remove(element)
Methode).
Im Gegensatz dazu die Iterator.remove
Methode für ein LinkedList
ist O(1)
.
Für ein ArrayList
Erstellen und Kopieren einer Liste ist O(N)
und verhältnismäßig billig, besonders wenn Sie sicherstellen können, dass die Kapazität der Zielliste groß genug (aber nicht zu groß) ist.
Im Gegensatz dazu ist das Erstellen und Kopieren nach a LinkedList
ist auch O(N)
aber deutlich teurer.
All dies summiert sich zu einem ziemlich komplizierten Entscheidungsbaum. Wenn die Listen klein sind (z. B. 10 oder weniger Elemente), können Sie wahrscheinlich mit einem der oben genannten Ansätze davonkommen. Wenn die Listen groß sein könnten, müssen Sie alle Probleme in der Liste der erwarteten Listengröße und der erwarteten Anzahl von Entfernungen abwägen. (Andernfalls erhalten Sie möglicherweise eine quadratische Leistung.)