2012-08-28 47 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