1

好吧,我已经阅读了很多关于从 中删除重复值的内容lists,但没有关于维护那些实际上在另一个列表中重复的值。我将尝试解释我的问题:

我必须从数据库中读取一些值并保存与我的搜索条件匹配的每个条目(整数条目)。此操作执行n次,因为它是循环操作。返回的对象必须是一个列表(或 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

4 回答 4

3

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

于 2013-07-17T13:35:12.203 回答
1

您可以开始迭代 list1 元素,并且当前元素需要在 list2 中验证(index = list2.indexOf(curElementInList1)如果索引 > -1,则将其添加到结果中(list3)。

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

于 2013-07-17T13:27:36.073 回答
1

您应该使用 sorted collection like TreeSetorTreeMap这样您就可以对 sorted collection 进行比较。然后按排序顺序,您可以遍历 2 个集合,因为它的排序将帮助您在 2n 时间(即 o(n) 时间)内找到重复元素。

例如,如果您有 DB 结果1,3,5,7,9,11,13,15和 tempList,2 5 8 11那么

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

1-2 删除1. 因为DB结果元素小于tempList元素,得到下一个DB结果元素

3-2 不删除。tempList 元素小于 DB 结果元素,获取下一个tempList 元素,依此类推

3-5 删除 3. 因为DB结果元素小于tempList元素,得到下一个DB结果元素

5-5 两者都相同,因此移至两者中的下一个元素。

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

9-8 不删除。tempList 元素小于 DB 结果元素,获取下一个tempList 元素,依此类推

9-11 删除 9. 因为DB结果元素小于tempList元素,得到下一个DB结果元素

11-11 两者都相同,因此移至两者中的下一个元素。

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

于 2013-07-17T13:55:22.737 回答
0

用这个:

result.retainAll(tempList);
于 2013-07-17T13:57:58.970 回答