2012-11-28 6 views
0

여기에 자신의 값을 변경 내 클래스의 :ArrayList의 모든 요소가 예기치 않게

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; 
     }   
    } 
} 

구문 분석 코드가 잘 작동하는지 나는 확신 (자바 프로젝트에서 테스트가).

마지막으로 arr의 모든 요소가 동일하게됩니다 (모두 갑자기 arr에 삽입 된 첫 번째 요소와 동일하게됩니다). 디버깅을하고 각 요소가 다른 요소와 다르다는 것을 알았습니다.

info 개체가 다를 때마다, 이는 arr에 다른 요소를 추가 함을 의미합니다. arr.add(info);. while 루프 디버깅은 모든 것이 정상이지만, AsyncTask을 종료하자마자 arr은 동일한 객체가 여러 개있는 ArrayList가됩니다.

어떻게 해결할 수 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

동일한 CompanyInfo 개체를 계속 다시 사용하기 때문에 가능합니다.
CompanyInfo info = new CompanyInfo();while 루프 내로 이동해야합니다.

2

풋이 내부 루프

CompanyInfo info = new CompanyInfo(); 

정보 새로운 CompanyInfo =() 등;

0

먼저 동일한 개체를 arr에 계속 추가하고 있습니다. 관찰 결과가 나오면 놀라지 마십시오.

둘째, 이터레이터 aIter을 상당히 비정상적으로 사용하고 있습니다. 반복자를 사용하고 색인을 반복하는 것처럼 보입니다.

관련 문제