Entfernen Sie in Java leere Elemente aus einer Liste von Strings

Lesezeit: 6 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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 umschließen, würde dies zu einer UnsupportedOperationException führen. Da Arrays.asList nicht strukturell geändert werden kann, kann die Operation removeIf nicht ausgeführt werden.

    – 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


Benutzer-Avatar
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

Benutzer-Avatar
nicht.gut.im.Codieren

  1. 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();
        }
    }
    
  2. 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

Benutzer-Avatar
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:

  1. Iterieren Sie über die Liste und rufen Sie auf Iterator.remove() für die Listenelemente, die Sie entfernen möchten. Das ist am einfachsten.

  2. 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.)

  3. 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.

  4. 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 ArrayListjeder 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 ArrayListErstellen 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.)

1115170cookie-checkEntfernen Sie in Java leere Elemente aus einer Liste von Strings

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy