2016-07-20 11 views
2

注:同様の質問があります。HEREしかし、私はこの質問を見直し、私の問題は解決しません。先読みしてください。削除されたリンクが含まれないように要素を更新するにはどうすればよいですか?

私はElementsから特定のリンクを削除しようとする方法を書いています。 remove()は、 obからを削除しています。ただし、Elementsを削除して、削除されたリンクが含まれないようにするにはどうすればよいですか?

以下は私の方法です。

public void getLinks(Document site) { 

    Elements links = site.select("a[href]"); 

    for(int i = 0 ; i < links.size() ; i++) { 

     String url = links.get(i).attr("abs:href"); 

     if(url.endsWith("~S1")) { 
     System.out.println(url); 
     } else { 
     links.remove(i); // links still contains removed Element 
     } 
    } 
} 
+1

Watchout! 'i <0'がループを開始する直前に' false'を返すため、 'for(int i = 0; i <0; i ++)'というループはループしません。 –

+1

どちらも使用できません。 0を使用する場合は、i> 0を使用すると無限のloop.insteadが0になり、別のInteger値が使用されます。forループでは、開始値で条件を繰り返し確認することができないためです。 –

+0

ポインタをありがとう:)しかし、私の問題は、まだ残っています。他のアイデア? – GiantSpruce

答えて

1

私はあなたがlistIteratorを使用することをお勧めします。 あなたが安全に

ListIterator<Element> it = links.listIterator(); 
while(it.hasNext()){ 
    Element link = it.next(); 
    String url = links.get(i).attr("abs:href"); 
    if(... {// your condition. I can't properly copy, writing from a mobile phone 
    link.remove(); 
    } 
} 
(ElementsはArrayListのクラスを拡張する)リストを反復しながら、要素を削除することができます

共通forオペレータによって反復しながら、リストから要素を削除しても安全ではないことを、覚えておいてください。再インデクシングのため。例えば。 5番目の要素を削除し、ループカウンタを1つ増やして、6番目の要素を削除し、7番目の要素を削除します。 Listインタフェースは空のインデックスを保持しないので、削除操作の直後に要素のリストを再編成して、破られないシーケンスを保持します。
削除、双方向反復などの目的で作成された、あなたの仕事ListIteratorのパワーに使用します。

1

削除されたリンクが含まれないように要素を更新するにはどうすればよいですか?

Elementsは実際に反復処理を必要とするか、またはこのために子要素(複数可)間でループしていないいくつかの便利なメソッドを提供します。

htmlの開始:Elementsオブジェクトから "S1" で終わるリンク削除するには

Elements elements = doc.select("a"); 

System.out.println(elements.outerHTML()); 

... 

<a href="foo.html?S1">foo</a> 
<a href="not_foo.html">not foo</a> 
<a href="foo2.html?S1">foo2</a> 

<html> 
<head></head> 
<body> 
    <div> 
    <a href="foo.html?S1">foo</a> 
    <a href="not_foo.html">not foo</a> 
    <a href="foo2.html?S1">foo2</a> 
    </div> 
</body> 
</html> 

はサンプルElements OBJを取得または

elements.removeAll(elements.select("a[href$=S1]")); 

System.out.println(elements.outerHTML()); 

... 

<a href="not_foo.html">not foo</a> 

を、新しいElements objを作成します"S1" で終わるリンク:

Elements cleanLinks = elements.not("a[href$=S1]"); 

System.out.println(cleanLinks.outerHtml()); 

... 

<a href="not_foo.html">not foo</a> 

注:Elements.remove(Collection)Elements.not(String)どちらがDocumentオブジェクトから要素を削除します。

関連する問題