0

これが私のクラスです:

public class JsoupParser 
{
    ArrayList<CompanyInfo> arr = new ArrayList<CompanyInfo>();

    public static final String SITE = "http://www.example.com/";

    public JsoupParser() {}

    public ArrayList<CompanyInfo> parse(final String link) 
                           throws InterruptedException, ExecutionException
    {

        new RealParser().execute(link).get();

        return arr;
    }

    class RealParser extends AsyncTask<String, Void, Void>
    {
        @Override
        protected Void doInBackground(String... params) 
        {

            Document doc = null;
            String link = params[0];
            try 
            {
                doc = Jsoup.connect(link).get();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }

            Elements a = doc.select("a.company_logo");
            Elements img = a.select("img");
            Iterator aIter = a.iterator();
            int i = 0;
            CompanyInfo info = new CompanyInfo();
            while(aIter.hasNext())
            {
                aIter.next();
                info.setCompanyName(a.get(i).attr("title"));
                info.setCompanyListingLink(SITE+ a.get(i).attr("href"));
                info.setCompanyLogoLink(SITE+ img.get(i).attr("src"));
                arr.add(info);
                ++i;
            }
            return null;
        }           
    }
}

確かに、解析コードは正常に機能します(Javaプロジェクトでテスト済み)。

問題は、arr最後ののすべての要素が同じになることです(すべてが突然に挿入された最初の要素と等しくなりarrます)。デバッグしてみると、各要素が別の要素とは異なっていることがわかります。

オブジェクトが異なるたびにinfo、つまり、これをarr行うために異なる要素を追加しarr.add(info);ます。ループ内でのデバッグはwhileすべて問題ありませんが、を終了するとすぐに、AsyncTaskarr複数の同じオブジェクトを持つArrayListになります。

どうすればこれを解決できますか?私は何が間違っているのですか?

4

3 に答える 3

2

CompanyInfoはい、同じオブジェクトを再利用し続けるためです。ループ内
を移動する必要があります。CompanyInfo info = new CompanyInfo();while

于 2012-11-28T12:54:48.383 に答える
2

これをループの中に入れて

CompanyInfo info = new CompanyInfo();

お気に入り

info = new CompanyInfo();

于 2012-11-28T12:57:01.763 に答える
0

まず、同じオブジェクトをarr何度も何度も追加します。それがあなたの観察された結果をもたらすとしても驚かないでください。

次に、aIter非常に珍しい方法でイテレータを使用しています。イテレータの使用とインデックスのループを混同したようです。

于 2012-11-28T12:58:01.030 に答える