【问题标题】:Remove objects from list - contains strings - Comparing the List从列表中删除对象 - 包含字符串 - 比较列表
【发布时间】:2019-03-19 21:41:04
【问题描述】:

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

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

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

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

我尝试使用:

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

很遗憾,它没有按我的意愿过滤我的列表。

感谢您的快速帮助

【问题讨论】:

  • 字符串“someone@domain.com”不可能等于域的列表。他们甚至不是同一类型。你需要更多地了解基本的东西,比如平等意味着什么。您要做的是从电子邮件地址中提取域(即将字符串“someone@domain.com”转换为字符串“domain.com”,然后检查域列表是否包含 结果(即包含“domain.com”)。

标签: java arraylist iterator removeall


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 由于域名不区分大小写,而您的列表可能包含混合大小写,您可能希望确保 list2 中的所有域都是小写,然后执行domains.contains("@" + email.split("@")[1].toLowerCase())。
  • 此外,split 使用正则表达式,这通常会占用大量 CPU 时间。更有效的方法可能是domains.contains(email.substring(email.indexOf('@').toLowerCase()))。
【解决方案2】:

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

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);
}

【讨论】:

    【解决方案3】:

    有点像

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

    应该工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多