Java 从列表中删除对象-包含字符串-比较列表
我的问题是-如何通过与第二个列表进行比较来从列表中删除对象 列表1-第一个列表包含电子邮件地址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
列表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]));