我使用LinkedHashSet来实现按条目排序的集合。如果添加了一个重复元素,它应该在结尾处,并且应该删除该集合中已有的条目。
我在讨论set.remove(条目)之前,是否值得检查set.contains(条目)是否值得?基本上检查包含()每次提供任何时间/空间的好处,而不是每次盲目调用remove()?
Set<Integer> set = new LinkedHashSet<>();
// The below
set.remove(entry);
set.add(entry);
// Versus the below
if (set.contains(entry)) {
set.remove(entry);
}
set.add(entry);
答案 0 :(得分:1)
我建议不要同时调用contains和remove。两个调用都必须搜索链以查找元素,而contains
执行此操作的速度不会快于remove
。因此,您每次拨打电话的时间可能会增加一倍。
您会发现两者最终都可能在HashMap的removeNode
和remove
中的某些点(contains
遍历哈希映射&#39; s getNode
),如果您的装置负载很重,可能会受到性能影响。
如果您的设置不是很重,那么它仍然可能不值得,但不是那么重要,因为在稀疏哈希链中设置预期的查找/删除是O (1)(即无论你有5个元素还是5000个元素,它都会一样快。)
答案 1 :(得分:1)
LinkedHashSet
HashMap
remove(Object)
仅在Object
对象contains
移除#include <iostream>
#include <string>
#include <algorithm>
int main(){
std::string s1 = " Hello World 1 ";
std::string s2 = " Hello World 2 ";
while(s1.find(' ') != std::string::npos){
s1.erase(s1.find(' '));
}
while(s2.find(' ') != std::string::npos){
s2.erase(std::find(s2.begin() , s2.end() ,' '));
}
std::cout<<s1<<"\n";
std::cout<<s2;
return 0;
}
因此不必要,并且会增加时间复杂度对象存在于集合中。