0

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

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

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

运行这个最有效的方法是什么?有什么功能可以为我做这件事吗?任何建议将不胜感激!

4

3 回答 3

6

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

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

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

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

于 2012-10-19T12:04:21.557 回答
3

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

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

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

    // test url
}

与执行相同数量的测试相比,这所做的工作要少得多,但要避免修改任何内容。

于 2012-10-19T12:09:07.610 回答
1

您应该在插入时检查:

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

contains()on HashSets 是 O(1),所以开销应该很低。

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

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

于 2012-10-19T12:36:55.130 回答