在Java中,我有一个字符串的ArrayList,如:
[,Hi, ,How,are,you]
我想删除null和empty元素,如何更改它,如下所示:
[Hi,How,are,you]
答案 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)
如果您要求如何删除空字符串,您可以这样做(l
是ArrayList<String>
) - 这会删除所有{ {1}}长度为0的引用和字符串:
null
不要将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)
您可以使用以下几种方法:
遍历列表,调用Iterator.remove()
以查找要删除的列表元素。这是最简单的。
反复拨打List.remove(Object)
。这也很简单,但表现最差......因为你反复扫描整个列表。 (但是,这可能是一个可变列表的选项,其迭代器由于某种原因而不支持remove
。)
创建一个新列表,遍历旧列表,将要保留的元素添加到新列表中。
如果您无法返回新列表,如上面的3.然后清除旧列表并使用addAll
将新列表的元素添加回其中。
其中哪一项最快取决于原始列表的类别,大小以及需要删除的元素数量。以下是一些因素:
对于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
输入中清除blank
和array
的值
public static String[] cleanArray(String[] array) {
return Arrays.stream(array).filter(x -> !StringUtils.isBlank(x)).toArray(String[]::new);
}
答案 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"))
...尽管当然与问题没有特别的联系。