根据另一个列表中的条件删除一个列表中的某些元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据另一个列表中的条件删除一个列表中的某些元素相关的知识,希望对你有一定的参考价值。

我是Java8的新手。我需要根据某些标准(来自另一个列表)在一个列表中减去/删除POJO并在UI上显示它。

迭代一个列表并搜索条件删除对象将原始列表发送到UI

Children.java
private String firstName;
private String lastName;
private String school;
private String personId;
// Setters and getters.

Person.java
private String personId;
private String fullName;
private String address;
// Setters and Getters.

..主要代码..

  // populated by other methods.
  List<Person> personList;

 //Connect to DB and get ChildrenList
 List<Children> childrenList = criteria.list();

 for(Children child : childrenList) {
    personList.removeIf(person -> child.getPersonId().equals(person.getPersonId()));
 }

有没有更好的方法来处理循环?任何帮助表示赞赏。

答案

你现在拥有的代码完美无缺,但也是O(n * m),因为removeIf为每个List迭代Children。改善的一种方法是将每个孩子的personId存储在Set<String>中,如果他们的Person包含在List<Person>中,则从personId中删除每个Set

Set<String> childIds = childrenList.stream()
                                   .map(Children::getPersonId)
                                   .collect(Collectors.toSet());

personList.removeIf(person -> childIds.contains(person.getPersonId()));
另一答案

只是另一种做同样但不改变原始列表的方法:

 Set<String> childIds = childrenList.stream()
                .map(Children::getPersonId)
                .collect(Collectors.toSet());

        personList = personList.stream().filter(person ->
                !childIds.contains(person.getPersonId())
        ).collect(Collectors.toList());

它应该有一些增加的空间复杂性,但你可以在这里利用parallelStream

以上是关于根据另一个列表中的条件删除一个列表中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章

检查元组列表中的所有第一个元素是不是满足条件

根据另一个列表中的真实条件从通用列表中选择项目

如何删除添加到列表中的最后一个元素?

基于逻辑条件的列表中的子集元素

python数组中怎样删除符合条件的元素

使用条件删除列表中的元素