Java比较两个列表并创建两个列表,一个找不到,另一个找不到

时间:2011-07-27 02:06:32

标签: java data-structures

我想比较java中的两个列表,并构建两个列表oneFound和另一个NotFound。

到目前为止,这是我的代码,请您提供最佳结果和有效方法的建议。

所以基本上我得到了一个要添加或更新的电子邮件列表。现在我想要实现的是我想要检查这些电子邮件与数据库中的电子邮件。如果它们存在于DB中,则只需更新它们,否则添加它们。

为此,我从数据库中获取电子邮件列表,然后尝试将该列表与要添加或更新的电子邮件列表进行比较。

然后我构建了2个列表,一个找到,另一个找不到。这些基础已更新,未找到将被插入数据库的基础。

以下代码构建中找不到已存在于db中的列表导致数据库插入(导致重复记录)。

因此,如果我正确构建找到并且未找到,那么更新和插入将正常工作。

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 个答案:

答案 0 :(得分:4)

明智地使用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

答案 1 :(得分:4)

我想你会喜欢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);
}

答案 2 :(得分:0)

将每个列表视为队列。在变量中加载每个队列的“头部”。循环,检查两个头值。如果离开&gt;右边,左边是唯一的(假设你从最低的开始),所以把它放在唯一的左边条目列表中,然后从左边列表中用新值重新加载。同样,如果正确&gt;只留下相反的方向。如果左==右,那么你有一个匹配 - 把它们放在匹配列表中,然后刷新两个变量。

保持此状态,直到一个列表为空。

答案 3 :(得分:0)

如何向电子邮件列添加唯一键,然后插入任何内容。如果电子邮件已存在,则DB将忽略它。然后就不需要比较2个列表了。

答案 4 :(得分:0)

以另一种方式解决问题......

随着越来越多的电子邮件被放入数据库,从数据库中获取整个列表然后运行比较可能变得难以处理。

如果您不需要知道实际添加了哪些电子邮件,则可以使用INSERT IGNOREINSERT ON DUPLICATE KEY UPDATE(或相当于您的数据库的等效电子邮件)将整个列表添加到数据库中。

如果您确实需要知道要添加的电子邮件,可以执行SELECT WHERE email IN (list of new emails)检索已存在的电子邮件,然后从您必须获取的电子邮件中删除该列表。存在。进一步扩展它,您可以创建临时表,将所有电子邮件放入其中,然后通过类似的查询删除存在的那些。

以上两种解决方案假设数据库列表增长到大量,而新电子邮件列表的大小仍然较小。