繁体   English   中英

从列表中删除空元素

[英]Remove null elements from list

List<String> list = new ArrayList<String>();
  list.add("One");
  list.add(null);
  list.add("Two!");
  list.add(null);
  list.add("Three");
  list.add(null);
  list.add("Four");
  list.add(null);

我有一个包含元素的列表。 有没有办法在不使用任何迭代的情况下从当前集合中删除元素?

这应该有效:

list.removeAll(Collections.singleton(null));  

在 java 8 中,您可以使用Collection.removeIf

list.removeIf(Objects::isNull);

扩展ArrayList并覆盖add()addAll()方法,并且根本不允许null

或者你可以使用list.removeAll(null); 如此处所示,它内部迭代循环

看看 LambdaJ,它允许您在“没有”循环的情况下操作集合。 实际上循环是在库内部实现的,但它真的很酷,它简化了代码并使其更短。

效率不高,但有效

while(list.remove(null));

当前的答案没有区分可变列表和不可变列表,我发现很多方法缺失。 这对于从引入的List.of(..)变得更加重要,尽管不能null元素传递给它。 无论如何,删除都是相关的(例如,删除某个非空元素)。

不可变列表

不可变列表的一个例子是Arrays.asList(..) (但仍然可以替换元素,但不能添加/删除)或已经提到的List.of(..) 只要不能使用List方法添加/删除元素,这些就被视为“不可变包装器”。

List<String> immutableList = Arrays.asList("one", null, "two");
  • 使用Stream#filter(Predicate)方法:

     List<String> newList = immutableList.stream() .filter(Objects::nonNull) .collect(Collectors.toList());
  • 带有索引或增强的 For-each 循环适用(不仅)适用于 Java 版本及更低版本。

     // note we need to create a mutable List to add the non-null elements List<String> newList = new ArrayList<>(); for (String str: immutableList) { if (str != null) { newList.add(str); } }

可变列表

可变列表的一个示例是List接口的新实例,例如new ArrayList<>()new LinkedList<>() 它们是可变的,因此使用List#addList#addAll List#add元素是可能的,也是一种常用的方法。

List<String> mutableList = new ArrayList<>(Arrays.asList("one", null, "two"));

以下列出了从此类List删除所有null元素的方法。 请注意,它会修改列表。

  • List#removeIf(Predicate)

     mutableList.removeIf(Objects::isNull);
  • Iterator是从List删除元素的推荐方法,适用于(不仅)Java 版本及更低版本

    Iterator<String> iterator = mutableList.iterator(); while (iterator.hasNext()) { if (iterator.next() == null) { iterator.remove(); } }
  • 不可变列表部分中提到的所有方式总是会产生一个新的List

如果您自己构建列表并且不确定该值是否为空,您也可以使用CollectionUtils.addIgnoreNull(list,elementToAdd); 这将防止添加空元素。 这仅在构建列表时有效。 如果您从其他地方接收列表并希望在使用列表之前删除所有非空元素,则list.removeAll(Collections.singleton(null)); 会是最好的

for (int i = 0; i <array.size(); i++) {
    for (int j = 0; j < array.size()-i-1; j++) {
        if (array.get(j) > array.get(j+i)){
            Integer t = array.get(j+i);
            array.set(j+i,array.get(j));
            array.set(j,t);
        }
    }
}

for(int i = array.size()-1; i >= 0; i--){

它是一个升序,这个问题的降序是什么?

使用google.common.

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

public List<String> removeBlanks(List<String> list) {
    return Lists.newArrayList(Iterables.filter(list, new Predicate<String>() {

        @Override
        public boolean apply(String arg) {
            return StringUtils.isNotEmpty(arg);
        }
    }));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM