在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)
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)
And*_*ose 16
现在我们有了Java 8 lambda表达式的另一种方法.
arrayList.removeIf(item -> item == null || "".equals(item));
Run Code Online (Sandbox Code Playgroud)
如果您使用的是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);
}
Run Code Online (Sandbox Code Playgroud)
如果你问如何删除空字符串,你可以做这样的(这里l是ArrayList<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)不要将数据ArrayList与数组混淆,ArrayList是一种动态数据结构,可根据数据的内容进行调整.如果您使用上面的代码,您不必做任何事情来获得结果,如您所描述的那样 - 如果您ArrayList是["","嗨","","如何","是","您"],如上所述删除后,它将正是您所需要的 - ["Hi","How","are","you"].
但是,如果您必须拥有原始列表的"已清理" 副本(同时保留原始列表)并通过" 存储回来 "表示" 复制 ",那么另一个答案中的krmby代码将为您提供服务精细.
您可以使用几种方法:
遍历列表,调用Iterator.remove()要删除的列表元素。这是最简单的。
反复打电话List.remove(Object)。这也很简单,但是表现最差……因为您反复扫描整个列表。(但是,remove由于某些原因,这可能是其迭代器不支持... 的可变列表的选项。)
创建一个新列表,遍历旧列表,然后将要保留的元素添加到新列表中。
如果您无法返回新列表,请按照上述3.进行操作,然后清除旧列表,然后使用addAll来将新列表的元素添加回去。
哪一个最快,取决于原始列表的类,其大小以及需要删除的元素数量。以下是一些因素:
对于ArrayList,每个单独的remove操作为O(N),其中N列表大小为。使用Iterator.remove()方法(或ArrayList.remove(element)方法)从大型ArrayList中删除多个元素非常昂贵。
相反,a的Iterator.remove方法LinkedList是O(1)。
对于ArrayList,创建和复制列表O(N)和 相对便宜的,特别是如果你能确保目标列表的容量足够大(但不是太大)。
相反,创建和复制到a LinkedList也O(N)很昂贵。
所有这些加在一起构成了相当复杂的决策树。如果列表很小(例如10个元素或更少),您可能可以采用上述任何方法。如果列表很大,则需要权衡列表中的所有问题,包括预期的列表大小和预期的删除数量。(否则,您可能会获得二次方性能。)
要把这个小金块放在这儿:
Stream.of("", "Hi", null, "How", "are", "you")
.filter(t -> !Strings.isNullOrEmpty(t))
.collect(ImmutableList.toImmutableList());
Run Code Online (Sandbox Code Playgroud)
我衷心希望 Java 有一个filterNot.
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)
| 归档时间: |
|
| 查看次数: |
95017 次 |
| 最近记录: |