从两个列表中删除NOT重复的对象

时间:2013-07-17 13:21:37

标签: java list arraylist

好吧,我已经阅读了很多关于从lists删除重复值的内容,但没有关于维护其他列表中实际上重复的内容。我会试着解释一下我的问题:

我必须从DB读取一些值并保存与我的搜索标准匹配的每个条目(整数条目)。此操作在 n 次完成,因为它是循环操作。返回的对象必须是List(或ArrayList,或者任何列表实现最适合我的目的)。

为清楚起见,一些伪代码

for (int i=0; i<nElements; i++) {

    tempList = getEntriesFromDb(i);

    if (i==0)
     result=tempList;

    else 
     //this is where I should maintain those entries that are in fact duplicated
     // in both tempList and result
     result = maintainDuplicates(result,tempList);

    }

retun result;

我想知道一些关于我的问题的建议。问题是,我可以创建一个新的循环,从列表中提取每个条目,创建一个(第三个!!)时间列表来保存它们等等。但我真的很清楚这将导致我的实施瓶颈。

任何帮助将不胜感激,提前谢谢。

4 个答案:

答案 0 :(得分:3)

这里的关键操作是在另一个列表中查找一个列表的每个元素。这可能是一个缓慢的操作。如果列表可能很长,我建议创建一个包含一个列表的所有元素的HashSet workingHash,然后在另一个列表上执行retainAll(workingHash)。

答案 1 :(得分:1)

你可以开始迭代list1元素,当前元素需要在list2中验证(index = list2.indexOf(curElementInList1),如果index是&gt; -1,而不是你将它添加到结果(list3)。

这是最慢的方法,但最容易理解。

答案 2 :(得分:1)

您应该使用排序集合,例如TreeSetTreeMap,这样您就可以对已排序的集合进行比较。然后按排序顺序,您可以迭代2个集合作为其排序,它将帮助您在2n时间内找到重复元素,即o(n)时间。

e.g。如果您的数据库结果为1,3,5,7,9,11,13,15,而临时列表为2 5 8 11则为

您可以同时开始迭代DB结果和tempList。从第一个元素1-2开始 因此,tempList中不存在1,因此1不重复,依此类推。所以比较和结果将是这样的。

1-2删除1.由于DB结果元素小于tempList元素,因此获取下一个DB结果ele

3-2不删除。 tempList元素小于DB结果元素,得到下一个tempList元素

3-5删除3.由于DB结果元素小于tempList元素,因此获取下一个DB结果ele

5-5两者都相同,所以移动到两者中的下一个元素。

7-8因为DB结果元素小于tempList元素,所以得到下一个DB结果ele

9-8不删除。 tempList元素小于DB结果元素,得到下一个tempList元素

9-11删除9.因为DB结果元素小于tempList元素,所以获取下一个DB结果ele

11-11两者都是相同的,所以移动到两者中的下一个元素。

所以这就是你得到5,11的结果。

答案 3 :(得分:0)

使用此:

result.retainAll(tempList);