1

2つのArrayList(sceneObjectsとanimationSceneObjectsと呼ばれる)を反復処理し、名前フィールドに基づいて2つを一致させようとしています。これが私のコードです:

Iterator<AnimationObject> itr = animationObjects.iterator();
Iterator<SceneObject> itrMain = sceneObjects.iterator();

while (itr.hasNext()) {
            AnimationObject object = itr.next();
            //Remove the word node from the animation object name so it matches main object name.
            String  tmpString = object.animationobjectName.replace("node-", "");
            System.out.println("Animation Object name is" +tmpString);
            while (itrMain.hasNext()) {
                SceneObject objectMain = itrMain.next();
                System.out.println("Scene Object name is" +objectMain.objectName);
                if (tmpString.equals(objectMain.objectName)) {
                    System.out.println("Animation Object matched to main object array" +tmpString);
                    objectMain.animations = object.animationData;
                    objectMain.hasAnimations = true;
                }
            }
        }

問題は、コードが意図したとおりに機能していないことです。つまり、itrイテレーターの最初の項目をitrMainイテレーターの値と比較するだけです。

誰かが私が間違っていることを見つけることができますか?

ありがとうございました。

4

4 に答える 4

1

内部ループを実行する前にリセットする必要がありitrMainます。そうしないと、最初にイテレータを使い果たした後、内部ループが呼び出されることはありません。

sceneObjects.iterator()内側のループに到達する前にを再割り当てするか、拡張されたfor-eachループを使用することでそれを行うことができます

Iterator<AnimationObject> itr = animationObjects.iterator();

while (itr.hasNext()) {
            Iterator<SceneObject> itrMain = sceneObjects.iterator();
       //    ^
       //   reassigning itrMain each iteration of the outer loop

            AnimationObject object = itr.next();
            //Remove the word node from the animation object name so it matches main object name.
            String  tmpString = object.animationobjectName.replace("node-", "");
            System.out.println("Animation Object name is" +tmpString);
            while (itrMain.hasNext()) {
                SceneObject objectMain = itrMain.next();
                System.out.println("Scene Object name is" +objectMain.objectName);
                if (tmpString.equals(objectMain.objectName)) {
                    System.out.println("Animation Object matched to main object array" +tmpString);
                    objectMain.animations = object.animationData;
                    objectMain.hasAnimations = true;
                }
            }
        }
于 2012-05-10T12:25:52.633 に答える
1

常に内側のループに新しいイテレータを使用します。

Iterator<AnimationObject> itr = animationObjects.iterator();

while (itr.hasNext()) {
    AnimationObject object = itr.next();
    //Remove the word node from the animation object name so it matches main object name.
    String  tmpString = object.animationobjectName.replace("node-", "");
    System.out.println("Animation Object name is" +tmpString);

    Iterator<SceneObject> itrMain = sceneObjects.iterator();

    while (itrMain.hasNext()) {
        SceneObject objectMain = itrMain.next();
        System.out.println("Scene Object name is" +objectMain.objectName);
        if (tmpString.equals(objectMain.objectName)) {
            System.out.println("Animation Object matched to main object array" +tmpString);
            objectMain.animations = object.animationData;
            objectMain.hasAnimations = true;
        }
    }
}

または(おそらくもっと簡単に)2つのforループを使用します:

for (AnimationObject animation : animationObjects) {
    for (SceneObject scenes : sceneObjects) {
        // snip...
    }
}
于 2012-05-10T12:26:05.520 に答える
1

外側のループステップごとに内側のイテレータを再起動しているわけではありません。実際に行うべきことは、for-eachループを使用することです。

for (AnimationObject ao : animationObjects) {
  ... your outer-loop code ...
  for (SceneObject so : sceneObjects) {
     ... your inner-loop code ...
  }
]
于 2012-05-10T12:26:25.910 に答える
1

最初のループ内でitrMainイテレータを宣言する必要があります。同じイテレータを保持している場合、最初の反復でそれが消費されます。

Iterator<AnimationObject> itr = animationObjects.iterator();
while (itr.hasNext()) {
    Iterator<SceneObject> itrMain = sceneObjects.iterator();
    [...]
于 2012-05-10T12:26:37.763 に答える