1

次のようなクラスAがあるとします

    public class A {
      protected static float[] floatArray = null;
      protected static Map<Integer, float[]>  history = new HashMap<Integer,float[]>();
      protected static Integer historyCount = 0;

      public void runEverySecond(Populator objPopulator) {
         floatArray = objPopulator.getValues();
         history.put(historyCount, floatArray);
         historyCount++;
      }  
    }

クラスBは次のようになります

    public class B {
      private A objA;
      protected final static Populator objPopulator = new Populator();

      public void run(Integer numOfTime) {
        for(int i = 0; i < numOfTime; i++)
           objA.runEverySecond(objPopulator);
      }
    }

クラスポピュレータは次のようになります

    public class Populator {
      protected float[] randomValues = new float[2];
      public float[] getValues() {
        randomValues[0] = //some new random float value generated for every call
        randomValues[1] = //some new random float value generated for every call
        return randomValues;
      }
    }

主な外観を含むクラスは次のとおりです

    public class MainClass {
      public static void main() {
        final B objB = new B();
        objB.run(10);
      }
    }

これが私が直面している問題です。マップ履歴には、マップ内のすべてのエントリに対して同じ値が含まれています。objPopulator.getValues() メソッドによって生成されたすべての値を Map 履歴に保存したいと考えています。どうすればいいのですか?

いくつかの助けは本当にかなりのものです。前もって感謝します :)

クラス A で表される実際のコード (無関係なコードを削除したもの)

public class MySuperAgent implements Agent {
protected static float[] marioFloatPos = null;
protected static Map<Integer, float[]> levelRecord = new HashMap<Integer, float[]>();
protected static Integer mapCount = 0;
/*  protected static int testCount = 0;
protected static float[] testx = new float[2];
protected static float[] testy = new float[2];*/

@Override
public void integrateObservation(Environment environment) {
    marioFloatPos = environment.getMarioFloatPos();
    levelRecord.put(mapCount, marioFloatPos);
    mapCount++;

   /*if(testCount < 2){
        testx[testCount] = marioFloatPos[0];
        testy[testCount] = marioFloatPos[1];
        testCount++;
    } else {
        testCount = 0;
    }*/
  }
}

クラス C は、環境オブジェクトを表すクラス B と同様のクラスから integrateObservation メソッドが呼び出されます。コメント ブロック内のコードを使用すると、マリオの x と y の過去の 2 つの値のみを記録できます。マリオの x と y のすべての値を保存する方法が必要です :)

4

2 に答える 2

2

のすべてのエントリには、その値Mapと同じ静的フィールドへの参照があります。floatArray

floatArray静的メンバー変数としてA考慮する代わりに、次のことを考慮してください。

  public void runEverySecond(Populator objPopulator) {
     float[] floatArray = objPopulator.getValues();
     history.put(historyCount, floatArray);
     historyCount++;
  }   

編集Aまた、クラスのコードがそのままコンパイルされる方法もわかりません。?の代わりにパラメータをrunEverySecond取るべきではありませんか?上記の改訂されたスニペットを参照してください。PopulatorObject

于 2012-04-07T13:13:40.340 に答える
1

1つだけありfloatArray、それを再割り当てし続けます。

このコードを合理的な方法で追跡することはほとんど不可能でした。

于 2012-04-07T13:12:58.987 に答える