如何从列表中删除空列表(Java)

sw2*_*sw2 11 java list arraylist

我已经搜索了这个,但它在其他语言中,如Python或R(?).我在列表中有列表,我想删除空列表.例如:

[[abc,def],[ghi],[],[],[jkl,mno]]

我想要:

[[abc,def],[ghi],[jkl,mno]]

如何从列表中删除空列表?谢谢!

Mic*_*cho 25

你也可以试试这个:

list.removeIf(p -> p.isEmpty());
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比接受的答案更好的选择,它的意图更明显. (4认同)
  • 但是,如果您有[http://stackoverflow.com/a/31196977/4086836],此答案将返回NullPointerException (3认同)
  • 也可以这样写:`list.removeIf(List :: isEmpty);` (2认同)

Ale*_*tes 12

你可以使用:

list.removeAll(Collections.singleton(new ArrayList<>()));
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说一下并解释一下那里发生了什么吗? (8认同)
  • 或`.removeAll(Collections.singleton(Collections.emptyList())` (2认同)

Rod*_*lfo 11

list.removeAll(Collections.singleton(new ArrayList<>()));
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于许多情况,但它依赖于列表中List 的equals方法实现,所以如果你有类似下面的代码,它将失败.

public class AnotherList extends ArrayList<String> {
    @Override
    public boolean equals(Object o) {
        return o instanceof AnotherList && super.equals(o);
    }
}

List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("abc", "def"));
list.add(Arrays.asList("ghi"));
list.add(new ArrayList<String>());
list.add(new ArrayList<String>());
list.add(new AnotherList());
list.add(null);
list.add(Arrays.asList("jkl", "mno"));
Run Code Online (Sandbox Code Playgroud)

解决方案是:

list.removeIf(x -> x != null && x.isEmpty());
Run Code Online (Sandbox Code Playgroud)

如果您不担心equals方法的不同实现,则可以使用其他解决方案.

  • `java.util.List`的契约实际上指定了`equals`的精确行为,以保证不会发生这个问题.当然,合同的这个方面不能由编译器强制执行; 尽管如此,你的例子中的问题是`AnotherList`违反了[Liskov替换原则](https://en.wikipedia.org/wiki/Liskov_substitution_principle).这个缺陷应该修复,而不是解决; 或者,如果没有这个,当期望`List`或`ArrayList`时,不应该使用它的实例. (2认同)