从列表中删除对象-包含字符串-比较列表

时间:2018-10-15 12:44:57

标签: java arraylist iterator removeall

我的问题是-如何通过与第二个列表进行比较从列表中删除对象。

列表1-第一个列表包含电子邮件地址
List2-第二个列表包含仅域,格式为“ @ domain.com ”等

我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件)。

例如:
如果List1包含电子邮件地址:“ email@domain.com”,第二个List2包含“ @ domain.com”,那么我想删除此电子邮件(从List1)

我尝试使用:

List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);

不幸的是,它没有按照我的意愿过滤列表。

感谢您的快速帮助

3 个答案:

答案 0 :(得分:5)

类似

list1.removeIf(email -> list2.stream().anyMatch(email::endsWith));

应该工作

答案 1 :(得分:3)

首先,使用您的域创建一个HashSet

Set<String> domains = new HashSet<>(list2);

现在,在第一个列表中使用removeIf

list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));

使用Set(而不是原始的list2)的想法是优化搜索,即使containsO(1)的摊销时间内运行。

注意:我假设list2中的所有域都以"@"开头。

答案 2 :(得分:1)

您可以创建要从第一个列表中删除的对象的新列表,然后将其删除:

List<String> objectsToBeRemoved = list1.stream()
                                        .filer(email-> isNotValidEmail(email,list2))
                                        .collect(toList());
list1.removeAll(objectsToBeRemoved);

另一种选择是使用removeIf:

    List<String> emails = new ArrayList<>(Arrays.asList("email@domain.com", "email2@domain.com","ssss@ff.com"));
    List<String> domains = new ArrayList<>(Arrays.asList("@domain.com"));
    emails.removeIf(email -> isNotValidEmail(domains, email));

private boolean isNotValidEmail(List<String> domains, String email) {
    return domains.stream()
            .anyMatch(email::endsWith);
}