java - 如何迭代包含与该对象类型相同的子对象的对象?

标签 java xml arrays iteration object-model

好吧,我已经到达了本世纪的思维螺丝,并坐下来思考了几个小时。我将在这里快速添加一个示例:

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/

相关文章:

ios - 显示提要中的评论数

java - 用 OO 方法替换 if else

java - 如何国际化 Java 中的应用程序?

java - Weblogic session 转发中未维护Java Servlet HttpSession

c# - 如何在 C# 中表示国家和语言?

php - 如何使用php将数组值存储到mysql表中的单个单元格中?

java - 如何在 JSF 中管理 EntityManager/Session?

sql-server - 在 SQL Server 中从 XML 中选择空值

c# - 使用 Linq 一般展平 XDocument?

java - 对象数组NullPointerException,处理3.3.6