0

私は3つのハッシュセットを持っています。goodLinkSet、badLinkSet、および testLinkSet。

goodLinkSet は機能する URL のリストを保持し、badLinkSet は機能しない URL のリストを保持します。testLinkSet には、良いか悪いかを確認する必要がある URL のリストが含まれています。ここにあるリンクの一部は、他の 2 つのセットで既にテストされています。

私がやりたいことは、URL を複数回テストしないように、goodLinkSet と badLinkSet に表示される te​​stLinkSet のすべての文字列/リンクを削除することです。私はこれをできるだけ効率的かつ迅速に行いたいと考えています。for each ループは少し遅いようです。

これを実行する最も効率的な方法は何ですか? 私のためにこれを行う機能はありますか?どんなアドバイスでも大歓迎です!

4

3 に答える 3

6

私がやりたいことは、URL を複数回テストしないように、goodLinkSet と badLinkSet に表示される te​​stLinkSet のすべての文字列/リンクを削除することです。

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

これは内部でループを実行しますが、(何百万もの) リンクがない限り、完了する前に 1 にカウントする時間がありません。

より良いパフォーマンスが必要な場合は、個々のリンクを追跡し、テスト時に削除/追加する必要があります。

于 2012-10-19T12:04:21.557 に答える
3

私がやりたいことは、URL を複数回テストしないように、goodLinkSet と badLinkSet に表示される te​​stLinkSet のすべての文字列/リンクを削除することです。

最も効率的な方法は、エントリを削除せず、必要に応じてテストすることです。

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()は、2 つのセットをテストする順序を入れ替えることもできます。

于 2012-10-19T12:36:55.130 に答える