- ベストアンサー
トラックバック先のURLの抽出でループを避けたい
ブログのトラックバック先のURLを取得するプログラムを作っています。 例えば、ブログAの記事に、B,Cのブログがトラックバックをして ブログBにブログaが、ブログCにはブログbがトラックバックをしていて、 さらにブログaにはブログ1がトラックバックをしていたとします。 このとき、ブログB,C,a,b,1のURLを取得するプログラムをこちらのご回答を参考にしながら、以下のように作りました。 public class BlogTB { public static void main(String[] args) { ArrayList al = new ArrayList(); String url = args[0]; addUrl(al, url); String[] TBURL = (String[])al.toArray(new String[0]); for(int i = 0 ; i < TBURL.length ; i++) { System.out.println(TBURL[i]); } } private static void addUrl(ArrayList al, String url) { al.add(url); String[] TBURL = HTMLTB.getHTMLtb(url); if (TBURL[0].equals("")) return; for(int i = 0 ; i < TBURL.length ; i++) { addUrl(al, TBURL[i]); } } } HTMLTB.getHTMLtbでは、トラックバック先のURLを取得する処理を行い、その一覧をTBURLに格納します。 この操作を再帰的に繰り返して、トラックバック先のURLを取得させています。 ここで、もし上記のケースで、 ブログ1がブログaにトラックバックをしていた場合(トラックバック返し)や、 ブログ1がブログAにトラックバックをしていた場合などでは、 上記のプログラムを走らせると、ループになっていまいます。 登録しようとしているurlがalに既に登録済みかどうかのチェックなど、 重複するURLをTBURLに登録しないようにして、 ループを防ぐためには、プログラムをどのように改正すればいいでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
重複チェックなら、HashSetがいいと思います。 URL登録先をArrayListからHashSetに変えてみました。 addUrlの最初に、URLがすでに登録されているか見て、 登録されていればその先の処理をしないようにしています。 (ただしHashSetを使うと、順序は保証されません) -------------------------- import java.util.HashSet; import java.util.Iterator; public class BlogTB { public static void main(String[] args) { HashSet hs = new HashSet(); String url = args[0]; addUrl(hs, url); Iterator it = hs.iterator(); while(it.hasNext() == true) { System.out.println((String)it.next()); } } private static void addUrl(HashSet hs, String url) { if(hs.contains(url) == true) { return; } hs.add(url); String[] TBURL = HTMLTB.getHTMLtb(url); if (TBURL[0].equals("")) return; for(int i = 0 ; i < TBURL.length ; i++) { addUrl(hs, TBURL[i]); } } }
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>取得した順序そのままで配列に格納したいのですが、 順序が大事な場合、vectorかArrayListに格納してやればいいでしょう。 vectorやArrayListにすでに登録されているかどうかは、indexOfを使って調べることができます。 リストが長くなると、重複登録のチェックに時間がかかるようになるので、登録チェックのためにはHashSetを使うというように混用してもいいかと思います。
お礼
ご回答ありがとうございます。 >vectorやArrayListにすでに登録されているかどうかは、indexOfを使って調べることができます。 >登録チェックのためにはHashSetを使うというように混用してもいいかと思います。 具体的にはどのようにプログラムを組めばよろしいでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
クラス変数でハッシュなどを使って、登録されていない場合に登録する(&再帰的に探しに行く) というような感じすればいいでしょう 例えば、HashSetで add(E)の返値を調べればハッシュに追加ができたかどうかで 新しく登録できたかどうかがわかります。
お礼
ご回答ありがとうございます。
お礼
ご回答ありがとうございます。 ご回答を参考にプログラムを動かし、 無事、ループせずにURLを取得できました。 ところで、HashSetを使うと、順序は保証されないとのことですが、 できれば取得した順序そのままで配列に格納したいのですが、 この場合はどのようにすればいいでしょうか?