2012-08-28 49 views
0

好吧,我已經達到了本世紀的思想頭腦,坐了幾個小時認真思考這個問題。我很快就會添加一個例子在這裏:如何遍歷包含與對象具有相同類型的子對象的對象?

public class AdUnitSizes { 

protected String environmentType; 
@XmlElement(name = "size") 
protected List<Size> sizes; 
protected List<Companions> companions; 

現在基本上,如果我要構建這個作爲一個XML文件,它會假設代表這樣的事情(注意,同伴的類型爲AdUnitSize [])

<adUnitSizes> 
    <size> 
     <width>800</width> 
     <height>600</height> 
     <isAspectRatio>true</isAspectRatio> 
    </size> 
    <environmentType>BROWSER</environmentType> 
    <companions> <!--adunitsize[]--> 
     <size> 
      <width>800</width> 
      <height>600</height> 
      <isAspectRatio>true</isAspectRatio> 
     </size> 
     <environmentType>BROWSER</environmentType> 
     <companions> 
      <size> 
       <width>800</width> 
       <height>600</height> 
       <isAspectRatio>true</isAspectRatio> 
      </size> 
      <environmentType>BROWSER</environmentType> 
      <companions>...</companions>  
     </companions>    
    </companions> 
</adUnitSizes> 

現在,我想指出,AdUnitSizes包含3個字段。大小,環境類型和隨播廣告。我現在正在嘗試使用我創建的對象包裝器(第一個示例)嘗試在每個子Companions對象和他們的子Companions對象迭代之前迭代不會進一步發生(它在我們的系統中不太可能那同伴會超過3個層次深,但我需要照顧這個反正)

這是我曾嘗試:

AdUnitSize[] adUnitSizeArray = adUnit.getAdUnitSizes(); 
    if(adUnitSizeArray != null){ 
     List<AdUnitSizes> adUnitSizesList = adUnitWrapper.getAdUnitSizes(); 
     for(int i = 0; i < adUnitSizeArray.length; i++){ 
      AdUnitSizes adUnitSizes = new AdUnitSizes(); 

      aem.adservices.google.dfp6.om.Size size = new aem.adservices.google.dfp6.om.Size(); //Name clash with Google Size Class 
      size.setHeight(adUnitSizeArray[i].getSize().getHeight()); 
      size.setWidth(adUnitSizeArray[i].getSize().getWidth()); 
      size.setIsAspectRatio(adUnitSizeArray[i].getSize().getIsAspectRatio()); 
      adUnitSizes.getSizes().add(size); 

      adUnitSizes.setEnvironmentType(adUnitSizeArray[i].getEnvironmentType().getValue()); 

      List<Companions> companionsList = adUnitSizes.getCompanions(); 
      //Need to iterate through all of adUnitSizeArray's Companions, and its companions children and so forth 
     } 
    } 

任何想法?我接近這個錯誤嗎?

+1

你試過了嗎?for(Companions companions:companionsList){...}' – SiB

+2

這不是遞歸中的一個簡單練習嗎? –

+0

看,這是問題,同伴,反過來,也包含同伴。 這樣就無法工作。 'for(Companions companions:companionsList){//包含大小,環境類型,同伴(0或更多)}我如何迭代這些兒童同伴? – Eon

回答

1

我不知道你用companyList做awhat,但戴維說,是遞歸的一件容易的事,所以你可以做:

//(...) 
    List<Companions> companionsList = adUnitSizes.getCompanions(); 
    iterateOverCompanions(companionsList); 
} 

private void iterateOverCompanions(List<Companions> companionsList) { 
    for(Companions companion : companionsList) { 
     //Do stuff with companion 
     List<Companions> anotherCompanionList = companion.getCompanionsList(); 
     if (anotherCompanionList != null && anotherCompanionList.size()>0) { 
      iterateOverCompanions(anotherCompanionList); 
     } 
    } 
} 

編輯:如果你需要傳遞的東西來填充,你可以將它們作爲一個參數,如:

iterateOverCompanions(List<Companions> companionsList, Size size, AnotherStuff stuff) 

,或將其作爲一個成員變量,如果這是確定的。

+0

值得一試,會給它一個鏡頭,提醒我一些非常匆忙的事情,我曾經在C#中做過,並得到了廢話多年前 – Eon

+0

請檢查我的編輯,看看它是否可以幫助您處理您的評論 – Montolide

+0

隨播廣告已包含需要填充的所有字段及其子項。你的例子有用,謝謝。 – Eon