Как перебрать объект, содержащий дочерние объекты того же типа, что и объект?
Хорошо, я достиг разума века и сидел несколько часов, размышляя об этом. Я быстро добавлю пример здесь:
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 поля. Размеры, EnvironmentTypes и Companions. То, что я сейчас пытаюсь сделать в Java, используя созданную мной обертку объектов (1-й пример), состоит в том, чтобы перебирать все дочерние объекты 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 ответ
Я не уверен, что вы делаете с companyList, но, как сказал Дейв, это тривиальное упражнение рекурсии, поэтому вы можете сделать:
//(...)
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)
или установите его как переменную-член, если это нормально.