在Java中,从字符串列表中删除空元素

Nir*_*mar 48 java arrays

在Java中,我有一个字符串的ArrayList,如:

[,Hi, ,How,are,you]
Run Code Online (Sandbox Code Playgroud)

我想删除null和empty元素,如何更改它,所以它是这样的:

[Hi,How,are,you]
Run Code Online (Sandbox Code Playgroud)

luk*_*ymo 84

List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
System.out.println(list);
list.removeAll(Arrays.asList("", null));
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

输出:

[, Hi, null, How]
[Hi, How]
Run Code Online (Sandbox Code Playgroud)

  • 从`java.util.AbstractList.remove()中给我'UnsupportedOperationException`` (8认同)
  • @shkschneider您是否复制并粘贴了此代码? (2认同)
  • 该死的,我重做了,它可以工作。我的错。真诚的 (2认同)

tok*_*khi 40

这是一个非常晚的答案,但你也可以使用Collections.singleton:

List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How"));
list.removeAll(Collections.singleton(null));
list.removeAll(Collections.singleton(""));
Run Code Online (Sandbox Code Playgroud)

  • @Derick 如果您不使用 new ArrayList&lt;String&gt; 包装 Arrays.asList,那么它会给出 UnsupportedOperationException。因为Arrays.asList不能在结构上修改,所以不能进行removeIf操作。 (2认同)

And*_*ose 16

现在我们有了Java 8 lambda表达式的另一种方法.

arrayList.removeIf(item -> item == null || "".equals(item));
Run Code Online (Sandbox Code Playgroud)

  • 使用Guava,你可以做`arrayList.removeIf(Strings :: isNullOrEmpty);`. (2认同)
  • 或者使用 Apache Commons `arrayList.removeIf(StringUtils::isEmpty);` (2认同)

The*_*ter 8

如果您使用的是Java 8那就试试这个使用lambda表达式和org.apache.commons.lang.StringUtils,这也将清除nullblank从数值array输入

public static String[] cleanArray(String[] array) {
    return Arrays.stream(array).filter(x -> !StringUtils.isBlank(x)).toArray(String[]::new);
}
Run Code Online (Sandbox Code Playgroud)

参考 - /sf/answers/2935512681/


no.*_*ing 7

  1. 如果你问如何删除空字符串,你可以做这样的(这里lArrayList<String>) -这将删除所有null长度为0的引用和字符串:

    Iterator<String> i = l.iterator();
    while (i.hasNext())
    {
        String s = i.next();
        if (s == null || s.isEmpty())
        {
            i.remove();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不要将数据ArrayList与数组混淆,ArrayList是一种动态数据结构,可根据数据的内容进行调整.如果您使用上面的代码,您不必做任何事情来获得结果,如您所描述的那样 - 如果您ArrayList是["","嗨","","如何","是","您"],如上所述删除后,它将正是您所需要的 - ["Hi","How","are","you"].

    但是,如果您必须拥有原始列表的"已清理" 副本(同时保留原始列表)并通过" 存储回来 "表示" 复制 ",那么另一个答案中的krmby代码将为您提供服务精细.


Ste*_*n C 5

您可以使用几种方法:

  1. 遍历列表,调用Iterator.remove()要删除的列表元素。这是最简单的。

  2. 反复打电话List.remove(Object)。这也很简单,但是表现最差……因为您反复扫描整个列表。(但是,remove由于某些原因,这可能是其迭代器不支持... 的可变列表的选项。)

  3. 创建一个新列表,遍历旧列表,然后将要保留的元素添加到新列表中。

  4. 如果您无法返回新列表,请按照上述3.进行操作,然后清除旧列表,然后使用addAll来将新列表的元素添加回去。

哪一个最快,取决于原始列表的类,其大小以及需要删除的元素数量。以下是一些因素:

  • 对于ArrayList,每个单独的remove操作为O(N),其中N列表大小为。使用Iterator.remove()方法(或ArrayList.remove(element)方法)从大型ArrayList中删除多个元素非常昂贵。

    相反,a的Iterator.remove方法LinkedListO(1)

  • 对于ArrayList,创建和复制列表O(N)相对便宜的,特别是如果你能确保目标列表的容量足够大(但不是太大)。

    相反,创建和复制到a LinkedListO(N)很昂贵。

所有这些加在一起构成了相当复杂的决策树。如果列表很小(例如10个元素或更少),您可能可以采用上述任何方法。如果列表很大,则需要权衡列表中的所有问题,包括预期的列表大小和预期的删除数量。(否则,您可能会获得二次方性能。)


Sam*_*rry 5

要把这个小金块放在这儿:

Stream.of("", "Hi", null, "How", "are", "you")
  .filter(t -> !Strings.isNullOrEmpty(t))
  .collect(ImmutableList.toImmutableList());
Run Code Online (Sandbox Code Playgroud)

我衷心希望 Java 有一个filterNot.


Ker*_*ğan 4

  • 这段代码可以顺利编译并运行。
  • 它不使用迭代器,因此更具可读性。
  • 列表是您的收藏。
  • 结果是过滤后的形式(无空无空)。

public static void listRemove() {
    List<String> list = Arrays.asList("", "Hi", "", "How", "are", "you");
    List<String> result = new ArrayList<String>();

    for (String str : list) {
        if (str != null && !str.isEmpty()) {
            result.add(str);
        }
    }

    System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能会抛出“java.lang.NullPointerException”,因为“str”可能是“null”。 (3认同)