Java Сравните два списка и создайте два списка, один найден, а другой не найден - PullRequest
2 голосов
/ 27 июля 2011

Я хочу сравнить два списка в java и построить два списка: один найденный, а другой - не найденный.

Вот мой код, пожалуйста, посоветуйте, пожалуйста, лучшие результаты и эффективный способ сделать это.

Итак, я получаю список писем для добавления или обновления.Теперь я пытаюсь добиться того, чтобы я сравнивал эти письма с теми, что в БД.если они существуют в БД, просто обновите их, в противном случае добавьте их.

Для этого я получаю список электронных писем из БД, а затем пытаюсь сравнить этот список со списком электронных писем, которые должны быть добавлены или обновлены.

Затем я строю 2 списка: один найден, а другой не найден.Найденные обновляются, а не найденные - это те, которые будут вставлены в БД.

Следующие сборки кода не найдены со списками, которые уже находятся в БД, что приводит к вставке БД (вызывает дублирование записей).

Так что, если я правильно построю найденный и не найденный, тогда обновление и вставка будут работать правильно.

public updateData (List<String> emailToAddList, List<String> emailToDeleteList) 
{

    List<String> emailsFromDB = Service.getEmailsFromDB();
    List<String> emailToUpdateFound = new ArrayList<String>( );
    List<String> emailToUpdateNotFound = new ArrayList<String>();

    /**
    **  compare emailToAddList with emailsFromDB, if found populate 
    **  emailToUpdateFound for data update, otherwise populate emailToUpdateNotFound for data insetion
    **/

    Collections.sort(emailListToAdd);
    Collections.sort(emailListfromDB);

    if(emailListToAdd.size() > emailListfromDB.size()
    {
    for(String addStr: emailListToAdd)
    {
        if(emailListfromDB.contains(addStr))
        {
            emailToUpdateFound.add(addStr);
        }
        else
        {
            emailToUpdateNotFound.add(addStr);
        }
    }

    }
    else
    { 
        for(String str: emailListfromDB)
        {
            if(emailListToAdd.contains(str))
            {
                emailToUpdateFound.add(str);
            }
            else
            {
                emailToUpdateNotFound.add(str);
            }

        }
    }
}

Спасибо

Ответы [ 5 ]

4 голосов
/ 27 июля 2011

Думаю, вам понравится метод org.apache.commons.collections.CollectionUtils.subtract (a, b) . Это отвечает вашим требованиям простым способом.

Вот мой пример кода:

public static void main(String[] args) {
    List<String> input = new ArrayList<String>();
    input.add("a");
    input.add("b");
    input.add("c");
    input.add("d");

    List<String> existing = new ArrayList<String>();
    existing .add("d");
    existing .add("b");
    existing .add("z"); 

    Collection<String> newStuff = CollectionUtils.subtract(input, existing);
    Collection<String> updateStuff = CollectionUtils.subtract(input,newStuff);

    System.out.println(newStuff);
    System.out.println(updateStuff);
}
4 голосов
/ 27 июля 2011

Разумное использование removeAll () и retainAll () на способ проще, чем вы пытаетесь.

Collection<String> c1;
Collection<String> c2;
c1.removeAll(c2); // set of elements in c1 not in c2
c1.retainAll(c2); // set of elements in c1 also in c2
0 голосов
/ 27 июля 2011

Чтобы подойти к проблеме по-другому ...

Чем больше сообщений помещается в базу данных, тем сложнее получить полный список из базы данных, а затем выполнить сравнение.

Если вам не нужно знать, какие электронные письма действительно были добавлены, вы можете использовать INSERT IGNORE или INSERT ON DUPLICATE KEY UPDATE (или эквивалент в зависимости от вашей базы данных), чтобы добавить весь список в базу данных.

Если вам нужно знать, какие электронные письма вы добавляете, вы можете сделать SELECT WHERE email IN (list of new emails), чтобы получить уже существующие, а затем вычесть этот список из тех, которые вам нужны, чтобы получить те, которые не существуют. , Расширив его еще больше, вы можете создать временную таблицу, поместить в нее все электронные письма, а затем удалить те, которые существуют, с помощью аналогичного запроса.

Приведенные выше два решения предполагают, что список базы данных увеличивается до большого числа, тогда как новый список адресов электронной почты остается меньшего размера.

0 голосов
/ 27 июля 2011

Как насчет добавления уникального ключа в столбец электронной почты, а затем просто вставить что-нибудь. Если электронная почта уже существует, БД игнорирует ее. Тогда нет необходимости сравнивать 2 списка.

0 голосов
/ 27 июля 2011

Рассматривать каждый список как очередь. Загрузите «голову» каждой очереди в переменную. Цикл, изучая два значения головы. Если left> right, left уникально (при условии, что вы начали с самого нижнего), поэтому поместите его в список уникальных левых записей, затем перезагрузите левое с новым значением из левого списка. Аналогично, если направо> налево, то только наоборот. Если слева == вправо, то у вас есть совпадение - поместите их в список совпадений, а затем обновите обе переменные.

Продолжайте до тех пор, пока один список не станет пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...