在Java中处理静态集合
假设我有一个a级,如下所示在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
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。不管怎样,我尝试了你的建议,结果还是一样:)我只是想知道我该怎么做