0

よし、私は世紀のマインドスクリューに到達し、これを考えながら数時間座った. ここに例を簡単に追加します。

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 でやろうとしているのは、私が作成したオブジェクト ラッパー (最初の例) を使用して、すべての子 Companions オブジェクト、およびその子 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
        }
    }

何か案は?私はこれに間違って近づいていますか?

4

1 に答える 1

1

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)

または、これでよければメンバー変数として設定します。

于 2012-08-28T12:57:33.897 に答える