Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从列表中删除对象-包含字符串-比较列表_Java_Arraylist_Iterator_Removeall - Fatal编程技术网

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

Java 从列表中删除对象-包含字符串-比较列表,java,arraylist,iterator,removeall,Java,Arraylist,Iterator,Removeall,我的问题是-如何通过与第二个列表进行比较来从列表中删除对象 列表1-第一个列表包含电子邮件地址 列表2-第二个列表仅包含“@domain.com”等格式的域 我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件) 例如: 如果列表1包含电子邮件地址:email@domain.com第二个列表2包含“@domain.com”-然后我想删除此电子邮件(从列表1) 我尝试使用: List1.removeIf(s -> s.equals (List2)); List1.removeAll(L

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

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

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

例如:
如果列表1包含电子邮件地址:email@domain.com第二个列表2包含“@domain.com”-然后我想删除此电子邮件(从列表1)

我尝试使用:

List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);
不幸的是,它没有像我希望的那样过滤我的列表


非常感谢您的快速帮助

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

List<String> objectsToBeRemoved = list1.stream()
                                        .filer(email-> isNotValidEmail(email,list2))
                                        .collect(toList());
list1.removeAll(objectsToBeRemoved);
List objectsToBeRemoved=list1.stream()
.filer(电子邮件->isNotValidEmail(电子邮件,列表2))
.collect(toList());
列表1.移除所有(对象被移除);
另一个选项是使用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);
}
List emails=new ArrayList(Arrays.asList(“email@domain.com", "email2@domain.com","ssss@ff.com"));
List domains=newarraylist(Arrays.asList(@domain.com));
emails.removeIf(email->isNotValidEmail(域,email));
私有布尔值isNotValidEmail(列出域、字符串电子邮件){
返回domains.stream()
.anyMatch(电子邮件::endsWith);
}
类似

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

如果要工作

首先,使用您的域创建一个
哈希集

Set<String> domains = new HashSet<>(list2);
使用
集合
(而不是原始的
列表2
)的想法是优化搜索,即使
包含
O(1)
摊销时间内运行


注意:我假设
list2
中的所有域都以
“@”

字符串开头someone@domain.com“不可能等于域列表。它们甚至不是同一类型的。你需要学习更多的基本知识,比如平等的含义。您要做的是从电子邮件地址中提取域(即转换字符串)someone@domain.com输入字符串“domain.com”,然后检查域列表是否包含结果(即包含“domain.com”)。由于域名不区分大小写,而您的列表可能包含大小写混合,因此您可能希望确保列表2中的所有域都是小写的,然后执行
domains.contains(“@”+email.split(“@”)[1]。toLowerCase()
。此外,split使用的正则表达式通常会占用大量CPU时间。更有效的方法可能是
域.contains(email.substring(email.indexOf('@').toLowerCase())
list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));