[英]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));
当前的答案没有区分可变列表和不可变列表,我发现很多方法缺失。 这对于从java-9 开始引入的List.of(..)
变得更加重要,尽管不能将null
元素传递给它。 无论如何,删除都是相关的(例如,删除某个非空元素)。
不可变列表
不可变列表的一个例子是Arrays.asList(..)
(但仍然可以替换元素,但不能添加/删除)或已经提到的List.of(..)
。 只要不能使用List
方法添加/删除元素,这些就被视为“不可变包装器”。
List<String> immutableList = Arrays.asList("one", null, "two");
java-stream从java-8 开始使用Stream#filter(Predicate)
方法:
List<String> newList = immutableList.stream() .filter(Objects::nonNull) .collect(Collectors.toList());
带有索引或增强的 For-each 循环适用(不仅)适用于 Java 版本java-7及更低版本。
// 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#add
或List#addAll
List#add
元素是可能的,也是一种常用的方法。
List<String> mutableList = new ArrayList<>(Arrays.asList("one", null, "two"));
以下列出了从此类List
删除所有null
元素的方法。 请注意,它会修改列表。
如果您自己构建列表并且不确定该值是否为空,您也可以使用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.