我正在使用集合从 ArrayList(从数据库填充)中获取重复项的列表
void getDuplicateHashTest() {
List<BroadcastItem> allDataStoreItems = itemsDAO.getAllItems();
Set<BroadcastItem> setOfAllData = new HashSet<>(allDataStoreItems);
List<BroadcastItem> diff = new ArrayList<>(setOfAllData);
allDataStoreItems.removeAll(diff);
}
所以在最后一行,所有不重复的项目都应该从所有项目的列表中删除。
问题是当我打印时allDataStoreItems.size()
我得到 0
集合和子列表打印正确的项目数。
我究竟做错了什么?
正如jacobm在回答中已经指出的那样:该Collection#removeAll
方法将删除所有出现的特定元素。但是创建列表并remove
重复调用的替代方案并不是一个好的解决方案:在 a 上List
,remove
调用通常具有 O(n) 复杂度,因此找出像这样的重复项将具有二次复杂度。
更好的解决方案是shamsher Khan 在他的回答 (+1!)中已经提到的解决方案:您可以遍历列表,并使用Set
.
该解决方案的复杂度为 O(n)。
不清楚您想要列表还是所有重复项的集合。例如,当输入是 时[1, 2,2,2, 3]
,结果应该是[2,2]
还是只是[2]
?但是,如果需要,您可以简单地计算重复项列表,并在第二步中使其元素唯一。
下面是一个例子:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class FindDuplicatesInList
{
public static void main(String[] args)
{
List<Integer> list = Arrays.asList(0,1,1,1,2,3,3,4,5,6,7,7,7,8);
List<Integer> duplicates = computeDuplicates(list);
// Prints [1, 1, 3, 7, 7]
System.out.println(duplicates);
// Prints [1, 3, 7]
System.out.println(makeUnique(duplicates));
}
private static <T> List<T> makeUnique(List<? extends T> list)
{
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
private static <T> List<T> computeDuplicates(List<? extends T> list)
{
Set<T> set = new HashSet<T>();
List<T> duplicates = new ArrayList<T>();
for (T element : list)
{
boolean wasNew = set.add(element);
if (!wasNew)
{
duplicates.add(element);
}
}
return duplicates;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句