在Java中处理静态集合

在Java中处理静态集合,java,collections,static,hashmap,Java,Collections,Static,Hashmap,假设我有一个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 vo

假设我有一个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++;
      }  
    }
    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);
      }
    }
包含main的类的外观如下

    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++;
      }  
    }
    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()方法生成的所有值。我该怎么做

一些帮助是非常值得的。 提前感谢:)

类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;
    }*/
  }
}
公共类MySuperAgent实现代理{
受保护的静态浮点[]marioFloatPos=null;
受保护的静态映射levelRecord=newHashMap();
受保护的静态整数mapCount=0;
/*受保护的静态int testCount=0;
受保护的静态浮点[]testx=新浮点[2];
受保护的静态浮点[]testy=新浮点[2]*/
@凌驾
公共空间综合观测(环境){
marioFloatPos=environment.getMarioFloatPos();
levelRecord.put(地图计数、MariofLatpos);
mapCount++;
/*如果(测试计数<2){
testx[testCount]=marioFloatPos[0];
testy[testCount]=marioFloatPos[1];
testCount++;
}否则{
testCount=0;
}*/
}
}
类C表示环境对象 integrateObservation方法是从类似于类B的类中调用的
如果我在注释块中使用代码,那么我只能记录Mario过去的2个x和y值。我需要一种方法来存储Mario的x和y的所有值:)

只有一个
floatArray
,您不断重新分配它


这段代码几乎不可能以合理的方式遵循——真是一团糟。

只有一个
floatArray
,您一直在重新分配它


这段代码几乎不可能以合理的方式遵循——真是一团糟。

地图中的每个条目都引用了与其值相同的静态字段
floatArray

不要将
floatArray
作为
a
中的静态成员变量考虑:

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

编辑我也不知道类
A
的代码是如何编译的。
runEverySecond
不应该使用
Populator
参数而不是
Object
?请参阅上面修订的代码段。

地图中的每个条目都引用了与其值相同的静态字段
floatArray

不要将
floatArray
作为
a
中的静态成员变量考虑:

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


编辑我也不知道类
A
的代码是如何编译的。
runEverySecond
不应该使用
Populator
参数而不是
Object
?请参阅上面修订的代码段。

我自己,我不会首先处理所有这些静态。Java中有一些称为“引用”,其他语言中有一些称为“指针”。如果你知道如何使用它们,它们是很棒的东西。@HovercraftFullOfEels:haha。。是的,所有的静力学都搞砸了。。不幸的是,我无法更改此类中的代码,因为还有其他数量的类正在使用这些值,我无法更改这些类中的代码,因为我不允许:(..@HotLicks:yes引用很好,但我无法更改其他类中我不负责的代码:)@Pazuzu:您可能想向您的团队提出一个更灵活的代码所有权流程:当然,您仍然必须确保解决向后兼容性问题。我自己,我不会首先处理所有这些静态。Java中有这些称为“引用”的东西,其他语言中有“指针”。如果你知道如何使用它们,它们是很棒的东西。@HovercraftFullOfEels:haha。。是的,所有的静力学都搞砸了。。不幸的是,我无法更改此类中的代码,因为还有其他数量的类正在使用这些值,我无法更改这些类中的代码,因为我不允许:(..@HotLicks:yes引用很好,但我无法更改其他类中我不负责的代码:)@Pazuzu:您可能希望向您的团队提出更灵活的代码所有权流程:当然,您仍然必须确保解决向后兼容性问题。您好milkplusvellocet,谢谢您的回复。这不是实际的代码,它只是真实事物的示例代码,感谢您指出我在类a中犯的错误:),是的,您是正确的,它应该是Populator而不是Object。无论如何,我尝试了你的建议,结果仍然是一样的:(.我只是想知道如何维护生成值的历史记录。如果我使用一个普通数组,比如大小为2的数组,那么在我的示例代码中,历史记录是正确的,但只记录了最后2代。我需要一种存储所有代的方法:)我刚刚试过这个,效果完全符合预期。你能发布实际的代码,包括我回答后你所做的更改吗?那么我们可以帮你更多。请看一下上面的实际代码。谢谢你的帮助,你还没有实施我最初建议的更改。您应该在
integrateObservation
方法中将其声明为局部变量,而不是
marioFloatPos
作为
MySuperAgent
的静态成员变量。因此,行应该是
float[]marioFloatPos=environment.getMarioFloatPos()我尝试了完全相同的事情。。地图中先前存储的值都将更改为地图中插入的最后一个值。很抱歉没有发布您的更改,我认为这会让新读者感到困惑。嗨,milkplusvellocet,谢谢您的回复。这不是实际的代码,它只是真实事物的示例代码,感谢您指出我在类a中犯的错误:),是的,您是正确的,它应该是Populator而不是Object。不管怎样,我尝试了你的建议,结果还是一样:)我只是想知道我该怎么做