好吧,我已经阅读了很多关于从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;
我想知道一些关于我的问题的建议。问题是,我可以创建一个新的循环,从列表中提取每个条目,创建一个(第三个!!)时间列表来保存它们等等。但我真的很清楚这将导致我的实施瓶颈。
任何帮助将不胜感激,提前谢谢。
答案 0 :(得分:3)
这里的关键操作是在另一个列表中查找一个列表的每个元素。这可能是一个缓慢的操作。如果列表可能很长,我建议创建一个包含一个列表的所有元素的HashSet workingHash
,然后在另一个列表上执行retainAll(workingHash)。
答案 1 :(得分:1)
你可以开始迭代list1元素,当前元素需要在list2中验证(index = list2.indexOf(curElementInList1)
,如果index是&gt; -1,而不是你将它添加到结果(list3)。
这是最慢的方法,但最容易理解。
答案 2 :(得分:1)
您应该使用排序集合,例如TreeSet
或TreeMap
,这样您就可以对已排序的集合进行比较。然后按排序顺序,您可以迭代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);