好吧,我已经到达了本世纪的思维螺丝,并坐下来思考了几个小时。我将在这里快速添加一个示例:
public class AdUnitSizes {
protected String environmentType;
@XmlElement(name = "size")
protected List<Size> sizes;
protected List<Companions> companions;
现在基本上,如果我将其构建为 XML 文件,它假设会表示类似这样的内容(注意,Companions 的类型为 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 个字段。大小、环境类型和同伴。我现在在java中尝试做的,使用我创建的对象包装器(第一个示例)是迭代每个子同伴对象,以及他们的子同伴对象,直到迭代无法进一步进行(在我们的系统中不太可能) 《同伴》的深度将超过 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
}
}
有什么想法吗?我这样做是错误的吗?
最佳答案
我不确定你对 companyList 做了什么,但正如 Dave 所说,这是一个简单的递归练习,所以你可以这样做:
//(...)
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)
或者将其设置为成员变量,如果可以的话。
关于java - 如何迭代包含与该对象类型相同的子对象的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159504/