Как перебрать объект, содержащий дочерние объекты того же типа, что и объект?

Хорошо, я достиг разума века и сидел несколько часов, размышляя об этом. Я быстро добавлю пример здесь:

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)

или установите его как переменную-член, если это нормально.

Другие вопросы по тегам