从java中的String数组中删除Null值

时间:2010-11-10 23:52:45

标签: java arrays string

如何从java中的String数组中删除空值?

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

我需要“firstArray”,没有像这样的空(空)值

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

8 个答案:

答案 0 :(得分:63)

如果你想避免使用fencepost错误并避免移动和删除数组中的项目,这里有一个使用List的有点冗长的解决方案:

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()]);
  }
}

添加了null以显示空字符串实例("")和null之间的区别。

由于这个答案大约是4.5岁,我正在添加一个Java 8示例:

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);    

    }
}

答案 1 :(得分:17)

如果您确实想要添加/删除数组中的项目,我建议您使用List吗?

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

然后,如果确实需要将其放回数组中:

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

答案 2 :(得分:5)

似乎没有人提到使用nonNull方法,它也可以与 Java 8 中的streams一起使用,以删除null(但不是空),因为:

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));

输出是:

  

[Apple ,, Cat,Dog ,, null]

     

[Apple ,, Cat,Dog,]

如果我们想要合并空,那么我们可以定义一个实用工具方法(在类Utils(比如说​​)):

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

然后使用它过滤项目:

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

我相信Apache common还提供了一种实用方法StringUtils.isNotEmpty,也可以使用它。

答案 3 :(得分:4)

使用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
    }
});

答案 4 :(得分:2)

这是我用来从不使用数组列表的数组中删除空值的代码。

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);

答案 5 :(得分:0)

一段对gc友好的代码:

public static<X> X[] arrayOfNotNull(X[] array) {
    for (int p=0, N=array.length; p<N; ++p) {
        if (array[p] == null) {
            int m=p; for (int i=p+1; i<N; ++i) if (array[i]!=null) ++m;
            X[] res = Arrays.copyOf(array, m);
            for (int i=p+1; i<N; ++i) if (array[i]!=null) res[p++] = array[i];
            return res;
        }
    }
    return array;
}

如果不包含空值,则返回原始数组。它不会修改原始数组。

答案 6 :(得分:0)

与上面已经发布的批准类似。但是,它更容易阅读。

/**
 * Remove all empty spaces from array a string array
 * @param arr array
 * @return array without ""
 */
public static String[] removeAllEmpty(String[] arr) {
    if (arr == null)
        return arr;

    String[] result = new String[arr.length];
    int amountOfValidStrings = 0;

    for (int i = 0; i < arr.length; i++) {
        if (!arr[i].equals(""))
            result[amountOfValidStrings++] = arr[i];
    }

    result = Arrays.copyOf(result, amountOfValidStrings);

    return result;
}

答案 7 :(得分:-1)

这些是零长度字符串,不是null。但是如果你想删除它们:

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

你可以将第二个移动到第一个:

firstArray[0]  = firstArray[1]

如果要对元素[1,2],[2,3]等进行此操作,最终会将数组的全部内容移到左侧,从而消除元素0.你能看出它是怎么回事吗?应用