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

时间:2011-04-02 02:19:55

标签: java arrays

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

[,Hi, ,How,are,you]

我想删除null和empty元素,如何更改它,如下所示:

[Hi,How,are,you]

13 个答案:

答案 0 :(得分:79)

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

输出:

[, Hi, null, How]
[Hi, How]

答案 1 :(得分:38)

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

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

答案 2 :(得分:14)

另一种方法是我们拥有Java 8 lambda表达式。

arrayList.removeIf(item -> item == null || "".equals(item));

答案 3 :(得分:7)

  1. 如果您要求如何删除空字符串,您可以这样做(lArrayList<String>) - 这会删除所有{ {1}}长度为0的引用和字符串:

    null
  2. 不要将Iterator<String> i = l.iterator(); while (i.hasNext()) { String s = i.next(); if (s == null || s.isEmpty()) { i.remove(); } } 与数组混淆,ArrayList是一个根据其内容调整大小的动态数据结构。如果你使用上面的代码,你没有做任何事情来得到你所描述的结果 - 如果你的ArrayList是[“”,“你好”,“”,“如何”,“是“,”你“],如上所述删除后,它将正是您所需要的 - ArrayList

    但是,如果您必须对原始列表进行“清理后的”复制(同时保留原始列表),并通过'将其存回'你的意思是'制作副本',然后另一个答案中的krmby代码将为您提供服务。

答案 4 :(得分:4)

您可以使用以下几种方法:

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

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

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

  4. 如果您无法返回新列表,如上面的3.然后清除旧列表并使用addAll将新列表的元素添加回其中。

    < / LI>

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

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

      相比之下,Iterator.remove的{​​{1}}方法为LinkedList

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

      相比之下,创建和复制到O(N)也是LinkedList,但要贵得多。

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

在这里放下这个小金块:

$("#drpType").change(function () {
    var SelectedVal = this.value;
    switch (SelectedVal) {
        case "2021":
            console.log('a');
            console.log('b');
            break; // <--

        case "2020":
            console.log('a');
            break; // <--

        case "ADB":
            console.log('b');
            break; // <--

        case "PWP":
            console.log('c');
            break; // optional. It's visually consistent but doesn't do anything
    }
}

我衷心希望Java有Stream.of("", "Hi", null, "How", "are", "you") .filter(t -> !Strings.isNullOrEmpty(t)) .collect(ImmutableList.toImmutableList());

答案 7 :(得分:3)

如果您使用的是Java 8,请使用lambda表达式和org.apache.commons.lang.StringUtils进行尝试,这也会从null输入中清除blankarray的值

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

答案 8 :(得分:2)

如果您UnsupportedOperationException使用上述某个答案而List是从Arrays.asList()创建的,那是因为您无法编辑此类List。< / p>

要修复,请将Arrays.asList()包裹在new LinkedList<String>()

    List<String> list = new LinkedList<String>(Arrays.asList(split));

来自此answer

答案 9 :(得分:1)

关于Andrew Mairose的评论 - 虽然这是一个很好的解决方案,但我想补充一点,这个解决方案不适用于固定大小列表。

您可以尝试这样做:

Arrays.asList(new String[]{"a", "b", null, "c", "    "})
    .removeIf(item -> item == null || "".equals(item));

但是您会遇到UnsupportedOperationException at java.util.AbstractList.remove(因为asList会返回不可调整大小的列表)。

不同的解决方案可能是:

List<String> collect =
    Stream.of(new String[]{"a", "b", "c", null, ""})
        .filter(item -> item != null && !"".equals(item))
        .collect(Collectors.toList());

这将产生一个很好的字符串列表: - )

答案 10 :(得分:0)

   private List cleanInputs(String[] inputArray) {
        List<String> result = new ArrayList<String>(inputArray.length);
        for (String input : inputArray) {
            if (input != null) {
                String str = input.trim();
                if (!str.isEmpty()) {
                    result.add(str);
                }
            }
        }
        return result;
    }

答案 11 :(得分:0)

hello/world.txt

OR

List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", "", "How"));
           Stream<String> stream = list .stream();
           Predicate<String> empty = empt->(empt.equals(""));
            Predicate<String> emptyRev = empty.negate();
           list=  stream.filter(emptyRev).collect(Collectors.toList());

答案 12 :(得分:0)

lukastymo的答案似乎是最好的答案。

但是由于它的可扩展性,也许值得一提。

List<String> list = new ArrayList<String>(Arrays.asList("", "Hi", null, "How", "are"));

list = list.stream()
           .filter(item -> item != null && !item.isEmpty())
           .collect(Collectors.toList());

System.out.println(list);

我的意思是,然后可以添加其他过滤器,例如:

          .filter(item -> !item.startsWith("a"))

...尽管当然与问题没有特别的联系。