我有List<Integer>
,此列表包含重复的元素:
//myList content is something like e.g. 1,2,1,3,3,6,7,...
List<Integer> myList = getNumbers();
我还有一个Set<String>
,众所周知,Set
只包含唯一的元素,没有重复的元素。我的Set<String>
包含String-type-integers:
//The Set content is String type integer , e.g. "1", "3", "5" …
Set<String> mySet = getNumSet();
我想将mySet
与myList
进行比较,以确定mySet
有哪些元素,但myList
没有&{从mySet
中删除这些元素。
我现在的做法是使用嵌套迭代,如下所示:
for(Integer i : myList){
for(String s : mySet){
if(!myList.contains(Integer.valueOf(s))){
mySet.remove(s);
}
}
}
有没有比我更有效的方法呢?
答案 0 :(得分:2)
最简单的方法可能是使用Collection#retainAll(Collection<?> c)
,这可以通过集合类型的功能进行一些优化来实现。
mySet.retainAll(myList)
但mySet
和myList
必须为Set<X>
和List<X>
。我建议您更改mySet
的声明并填写Integer#valueOf(String s)
之类的内容,然后使用retainAll
方法。
答案 1 :(得分:2)
for (Iterator<String> it = mySet.iterator(); it.hasNext();) {
if(myList.contains(Integer.parseInt(it.next()))){
it.remove();
}
}
答案 2 :(得分:1)
假设您在集合中有 m 个元素,并且列表中有 n 个元素。
然后从集合中删除项目是 O(log m),并在列表中迭代 O(n)。总体复杂度为 O(n×log m)。减法最多为 O(m×log m),因此总体复杂度为 O(s×log s)其中 s = max(m,n) )
您的算法的复杂性是 O(n 2 ×(log m) 2 ),因为您
答案 3 :(得分:0)
实际上需要更多信息才能找到最佳方法。
如果myList.size()&gt;&gt; mySet.size(),遵循Oswald的解决方案,或
如果mySet.size()&gt;&gt; myList.size(),最好的解决方案是将myList转换为新的String字符集,然后调用mySet.retainAll方法。