2010-11-10 14 views
23

Wie Null-Wert aus String-Array in Java entfernen?Entfernen Null-Wert von String-Array in Java

String[] firstArray = {"test1","","test2","test4",""}; 

Ich brauche den "first" ohne null (leer) Werte wie diese

String[] firstArray = {"test1","test2","test4"}; 
+24

'null' ist völlig anders als" leere Zeichenfolge "in Java. Das ist dein erstes Problem. –

+0

null ist nicht "". "" ist eine leere, aber vollkommen gültige Zeichenfolge. – EboMike

+0

In diesem Array ist kein Nullwert vorhanden. Es gibt jedoch einen leeren Stich (ein Nicht-Null-String-Objekt mit einer Länge von 0). Wie auch immer, * was * hast du versucht? –

Antwort

57

Wenn Sie fencepost Fehler vermeiden wollen und vermeiden Elemente in einem Array Verschieben und Löschen, hier ist ein etwas ausführliche Lösung, die List verwendet:

import java.util.ArrayList; 
import java.util.List; 

public class RemoveNullValue { 
    public static void main(String args[]) { 
    String[] firstArray = {"test1", "", "test2", "test4", "", null}; 

    List<String> list = new ArrayList<String>(); 

    for(String s : firstArray) { 
     if(s != null && s.length() > 0) { 
      list.add(s); 
     } 
    } 

    firstArray = list.toArray(new String[list.size()]); 
    } 
} 

Added null zeigen den Unterschied zwischen einer leeren String-Instanz ("") und null.

Da diese Antwort ist etwa 4,5 Jahre alt, ich bin ein Java 8 Beispiel fügt hinzu:

import java.util.Arrays; 
import java.util.stream.Collectors; 

public class RemoveNullValue { 
    public static void main(String args[]) { 
     String[] firstArray = {"test1", "", "test2", "test4", "", null}; 

     firstArray = Arrays.stream(firstArray) 
        .filter(s -> (s != null && s.length() > 0)) 
        .toArray(String[]::new);  

    } 
} 
+0

danke das funktioniert gut –

+0

Das ist toll, aber sind nicht 3 von 4 dieser Importe nicht verwendet? –

+0

@ Hack-R Ja und es war, weil ich meine alte Antwort kopierte und nur den Code änderte, als ich ihn aktualisierte. : D –

-1

Das sind leere Zeichenfolge, nicht null. Aber wenn man sie entfernen möchten:

firstArray[0] refers to the first element 
firstArray[1] refers to the second element 

Sie können den zweiten in die erste thusly bewegen:

firstArray[0] = firstArray[1] 

Wenn Sie waren dies für Elemente tun [1,2], dann [2, 3], usw. Sie würden schließlich den gesamten Inhalt des Arrays nach links verschieben, wodurch das Element 0 eliminiert wird. Können Sie sehen, wie das aussehen würde?

+1

Dann lautet die Frage: "Wie können Sie ein Array in Java skalieren"? :-) –

+0

Das tut nicht wirklich was er will. Dies kopiert nur Daten herum. Es macht nichts, um das Array kleiner zu machen. – mlathe

+0

Der Punkt war, ihn in die richtige Richtung zu bringen. – Falmarri

14

Wenn Sie tatsächlich Elemente aus einem Array hinzufügen/entfernen möchten, kann ich stattdessen eine List vorschlagen?

String[] firstArray = {"test1","","test2","test4",""}; 
ArrayList<String> list = new ArrayList<String>(); 
for (String s : firstArray) 
    if (!s.equals("")) 
     list.add(s); 

Dann, wenn Sie wirklich, dass wieder in ein Array stellen müssen:

firstArray = list.toArray(new String[list.size()]); 
+0

Haha. Du hast implementiert, was ich beschrieben habe! :-) Meine einzige Verbesserung wäre, einen 'neuen String [0]' an den 'toArray' zu übergeben - es wird ein neues Array mit der richtigen Größe nach Bedarf erstellt. –

+0

Sie sollten 'String.isEmpty()' anstelle von 'String.equals (" ")' –

+0

@Steve verwenden, fühlen sich viele Leute so, wie Sie es tun. Ich denke nur (persönlich), dass 'e.quals (" ") lesbarer ist - weniger abstrakt. –

4

Mit Google guava library

String[] firstArray = {"test1","","test2","test4","",null}; 

Iterable<String> st=Iterables.filter(Arrays.asList(firstArray),new Predicate<String>() { 
    @Override 
    public boolean apply(String arg0) { 
     if(arg0==null) //avoid null strings 
      return false; 
     if(arg0.length()==0) //avoid empty strings 
      return false; 
     return true; // else true 
    } 
}); 
+2

Entlang dem gleichen Ansatz könnte man die FunctionalJava-Bibliothek verwenden. –

+0

@Emil Und dann, wie stellst du, was ist innen "st" zurück in 'firstArray'? – Abdull

+0

@Abdull: Das ist nicht nötig, da firstArray nicht modifiziert wird. Die Filterung erfolgt während der Iteration des Arrays mit lazily.i. – Emil

2

Dies ist der Code, den ich NULL-Werte entfernen verwenden von einem Array, das keine Array-Listen verwendet.

String[] array = {"abc", "def", null, "g", null}; // Your array 
String[] refinedArray = new String[array.length]; // A temporary placeholder array 
int count = -1; 
for(String s : array) { 
    if(s != null) { // Skips over null values. Add "|| "".equals(s)" if you want to exclude empty strings 
     refinedArray[++count] = s; // Increments count and sets a value in the refined array 
    } 
} 

// Returns an array with the same data but refits it to a new length 
array = Arrays.copyOf(refinedArray, count + 1); 
+0

In der letzten Zeile ist ein Fehler nach dem anderen aufgetreten. Sollte "count + 1" sein – coolguy

2

Es scheint niemand mit streams in Java 8nonNull Verfahren zur Verwendung, die auch verwendet werden kann, entfernen null (aber nicht leer), wie erwähnt:

String[] origArray = {"Apple", "", "Cat", "Dog", "", null}; 
String[] cleanedArray = Arrays.stream(firstArray).filter(Objects::nonNull).toArray(String[]::new); 
System.out.println(Arrays.toString(origArray)); 
System.out.println(Arrays.toString(cleanedArray)); 

Und der Ausgang ist :

[Apple, Katze, Hund,, null]

[Apple, Katze, Hund,]

Wenn wir auch leer zu übernehmen wollen, dann können wir eine Hilfsmethode definieren (in der Klasse Utils (sagen wir)):

public static boolean isEmpty(String string) { 
     return (string != null && !string.isEmpty()); 
    } 

Und dann verwenden, zu filtern, die Elemente wie:

Arrays.stream(firstArray).filter(Utils::isEmpty).toArray(String[]::new); 

glaube ich Apache gemeinsam stellt auch ein Dienstprogramm Methode StringUtils.isNotEmpty, die auch verwendet werden können.