Java:尽可能高效地比较哈希集

时间:2012-10-19 12:01:44

标签: java performance hashset

我有3个哈希集。 goodLinkSet,badLinkSet和testLinkSet。

goodLinkSet包含有效的URL列表,badLinkSet包含不起作用的URL列表。 testLinkSet包含一个URL列表,我需要检查它们是否良好,这里的一些链接已经在其他两个集中进行了测试。

我想要做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL。我希望尽可能快速有效地完成这项工作。每个循环的A似乎有点慢。

运行此方法最有效的方法是什么?有什么功能可以帮我吗?任何建议都将非常感谢!

3 个答案:

答案 0 :(得分:6)

  

我想要做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL。

testLinkSet.removeAll(goodLinkSet);
testLinkSet.removeAll(badLinkSet);

这将在内部运行一个循环,但除非你有(很多)数百万个链接,否则在完成之前你没有时间计算到1。

如果您需要更好的性能,则应该跟踪每个链接并在测试时删除/添加它们。

答案 1 :(得分:3)

  

我想要做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL。

最有效的方法是不删除条目,而是根据需要对其进行测试。

for(URL url: testLinkSet) {
    if(goodLinkSet.conatins(url) || badListSet.conatins(url)) continue;

    // test url
}

这样做的工作量远远少于同样数量的测试,但避免修改任何内容。

答案 2 :(得分:1)

您应该在插入时检查:

boolean addToTestLinkSet(String str) {
  if (goodLinkSet.contains(str) || badLinkSet.contains(str))
    return false;
  testLinkSet.add(str);
  return true;
}
contains()上的

HashSet是O(1),因此开销应该很低。

解决方案与Peter的解决方案非常相似,但使用更少的内存还有额外的好处(因为它可以避免在testLinkSet中暂时存储无用的条目)。

此外,如果你知道badLinkSet.size() > goodLinkSet.size(),你甚至可以交换测试这两套的顺序。