Удалить объекты из списка - содержит строки - Сравнение списка - PullRequest
0 голосов
/ 15 октября 2018

Мой вопрос - Как удалить объекты из списка, сравнивая его со вторым списком.

Список1 - Первый список содержит адреса электронной почты .Список 2 - Второй список содержит только домены в формате "@domain.com" и т. Д.

Я хочу удалить объекты (электронные письма) из первогосписок, содержащий домены из второго списка.

Например:Если List1 содержит адрес электронной почты: «email@domain.com», а второй List2 содержит «@ domain.com» - тогда я хочу удалить это письмо (из List1)

Я пытался использовать:

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

К сожалению, он не фильтрует мой список так, как мне бы хотелось.

Буду благодарен за вашу скорую помощь

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Что-то вроде

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

должно работать

0 голосов
/ 15 октября 2018

Сначала создайте HashSet со своими доменами:

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

Теперь используйте removeIf в первом списке:

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

Идея использовать Set (вместо исходного list2) - оптимизировать поиск, т. е. заставить contains работать за O(1) амортизированное время.

Примечание: Я предполагаю, что все доменыв list2 начинаются с "@".

0 голосов
/ 15 октября 2018

Вы можете создать новый список объектов, которые будут удалены из первого списка и после их удаления:

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