从列表中删除对象 - 包含字符串 - 比较列表
Remove objects from list - contains strings - Comparing the List
我的问题是 - 如何通过将对象与第二个列表进行比较来从列表中删除对象。
List1 - 第一个列表包含 电子邮件地址 。
List2 - 第二个列表包含仅域,格式为“@domain.com”等
我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件)。
例如:
如果 List1 包含电子邮件地址:"email@domain.com" 并且第二个 List2 包含“@domain.com” - 那么我想删除此电子邮件(来自 List1)
我尝试使用:
List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);
不幸的是,它没有按照我的意愿过滤我的列表。
我将感谢你的快速帮助
您可以创建要从第一个列表中删除的对象的新列表,然后删除它们:
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);
}
类似于
list1.removeIf(email -> list2.stream().anyMatch(email::endsWith));
应该可以
首先,使用您的域创建一个 HashSet
:
Set<String> domains = new HashSet<>(list2);
现在,在第一个列表中使用 removeIf
:
list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));
使用Set
(而不是原来的list2
)的想法是优化搜索,即contains
运行 in O(1)
摊销时间。
注意: 我假设 list2
中的所有域都以 "@"
.
开头
我的问题是 - 如何通过将对象与第二个列表进行比较来从列表中删除对象。
List1 - 第一个列表包含 电子邮件地址 。
List2 - 第二个列表包含仅域,格式为“@domain.com”等
我想从第一个列表中删除包含第二个列表中的域的对象(电子邮件)。
例如:
如果 List1 包含电子邮件地址:"email@domain.com" 并且第二个 List2 包含“@domain.com” - 那么我想删除此电子邮件(来自 List1)
我尝试使用:
List1.removeIf(s -> s.equals (List2));
List1.removeAll(List2);
不幸的是,它没有按照我的意愿过滤我的列表。
我将感谢你的快速帮助
您可以创建要从第一个列表中删除的对象的新列表,然后删除它们:
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);
}
类似于
list1.removeIf(email -> list2.stream().anyMatch(email::endsWith));
应该可以
首先,使用您的域创建一个 HashSet
:
Set<String> domains = new HashSet<>(list2);
现在,在第一个列表中使用 removeIf
:
list1.removeIf(email -> domains.contains("@" + email.split("@")[1]));
使用Set
(而不是原来的list2
)的想法是优化搜索,即contains
运行 in O(1)
摊销时间。
注意: 我假设 list2
中的所有域都以 "@"
.