2012-05-10 7 views
1

2つのArrayList(sceneObjectsとanimationSceneObjects)を繰り返し処理し、名前フィールドに基づいて2つを一致させようとしています。ここに私のコードは次のとおりです。2つのArrayListをネストしたWhileステートメントで反復する - Java

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; 
       } 
      } 
     } 

問題は、意図したとおりのコードが動作していないということである - それだけでitrMainイテレータの値にITRイテレータの最初の項目を比較します。

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

ありがとうございます。

答えて

1

内側のループを実行する前にitrMainをリセットする必要があります。それ以外の場合は、初めて内部ループが呼び出されることはありません。あなたは内側のループに到達する前に

あなたはsceneObjects.iterator()で再割り当てることによってそれを行うことができ、またはこれまでに時間内部ループ用の新しいイテレータを使用して強化for-each loop

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; 
       } 
      } 
     } 
+0

素晴らしい - ありがとうございます。 – GuybrushThreepwood

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... 
    } 
} 
1

外部ループステップごとに内部イテレータを再起動していません。あなたが本当にすべきことはfor-eachループを使うことです。

for (AnimationObject ao : animationObjects) { 
    ... your outer-loop code ... 
    for (SceneObject so : sceneObjects) { 
    ... your inner-loop code ... 
    } 
] 
1

最初のループ内にitrMainイテレータを宣言する必要があります。 同じイテレータを使用すると、最初の反復で消費されます。

Iterator<AnimationObject> itr = animationObjects.iterator(); 
while (itr.hasNext()) { 
    Iterator<SceneObject> itrMain = sceneObjects.iterator(); 
    [...] 
関連する問題