【问题标题】:How to remove an empty list from a list (Java)如何从列表中删除空列表(Java)
【发布时间】:2015-09-20 16:39:30
【问题描述】:

我已经搜索过这个,但它是用 Python 或 R (?) 等其他语言编写的。 我在列表中有列表,我想删除空列表。 例如:

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

我想要:

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

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

【问题讨论】:

  • 我会试试list.removeAll(new ArrayList());
  • @Kon 没用
  • 为什么 null 或 "" 会匹配一个空列表?您似乎对这里发生的事情有一个非常奇怪和错误的想法。

标签: java list arraylist


【解决方案1】:

你也可以试试这个:

list.removeIf(p -> p.isEmpty());

【讨论】:

  • 这是一个比公认答案更好的选择,它的意图更明显。
  • 但是,如果你有这个 [stackoverflow.com/a/31196977/4086836],这个答案将返回 NullPointerException
  • 也可以这样写:list.removeIf(List::isEmpty);
【解决方案2】:

你可以使用:

list.removeAll(Collections.singleton(new ArrayList<>()));

【讨论】:

  • 你能详细解释一下里面发生了什么吗?
  • .removeAll(Collections.singleton(Collections.emptyList())
【解决方案3】:
list.removeAll(Collections.singleton(new ArrayList<>()));

上面的代码在很多情况下都可以正常工作,但它依赖于列表中 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"));

解决办法是:

list.removeIf(x -> x != null && x.isEmpty());

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

【讨论】:

  • java.util.List的合约实际上指定了equals的精确行为,以保证不会出现这个问题。当然,合约的这一方面不能由编译器强制执行;尽管如此,您示例中的问题是AnotherList 违反了the Liskov substitution principle。该缺陷应该被修复,而不是解决;或者,如果不这样做,则不应在预期 ListArrayList 时使用它的实例。
猜你喜欢
  • 2021-07-11
  • 2017-11-02
  • 2022-11-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2014-01-06
  • 2021-08-21
相关资源
最近更新 更多