2012-04-07 19 views
1

sagen, dass ich eine Klasse A haben, die alsHandhabung Statische Sammlungen in Java

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

und Klasse B sieht

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

und Klasse Populator sieht wie folgt aus

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

und Klasse mit Haupt sieht wie folgt aus

Hier ist das Problem, das ich bin vor, enthält die Karte Geschichte den gleichen Wert für jeden Eintrag in der Karte. Ich möchte, dass der Map-Verlauf alle von der objPopulator.getValues ​​() -Methode generierten Werte speichert. Wie mache ich es?

würde Einige helfen wirklich spürbar sein. Dank im Voraus :)

der eigentliche Code (mit irrelevantem Code entfernt) nach Klasse stellte eine

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

Klasse C repräsentiert Umgebungsobjekt integrateObservation Methode aus der Klasse genannt ähnelt Klasse B Wenn ich der Code innerhalb des Kommentarblocks, dann kann ich nur 2 vergangene Werte von x und y von Mario aufzeichnen. Ich brauche einen Weg, um alle Werte von x und y von Mario zu speichern :)

+2

Ich selbst würde mich nicht mit all diesen Statiken beschäftigen. –

+0

Es gibt diese Dinge, die "Referenzen" in Java, "Zeiger" in anderen Sprachen genannt werden. Sie sind wundervolle Dinge, wenn Sie wissen, wie man sie benutzt. –

+0

@HovercraftFullOfEels: haha ​​.. ja all die Statik ist wirklich vermasselt .. leider kann ich nicht den Code in dieser Klasse ändern, weil es andere Anzahl von Klassen ist die Thesen Wert verwenden, und ich kann in diesen Klassen nicht-Code ändern, weil ich nicht bin zu :(.. – Pazuzu

Antwort

2

Es gibt nur eine floatArray und Sie neu zuweisen.

Dieser Code wurde fast unmöglich, in einer angemessenen Art und Weise zu folgen - was für ein Chaos.

+0

Hallo Dave Newton, Danke für deine Antwort, ich weiß, dass der Code ein Chaos ist, aber das ist nur ein Beispiel für den echten Code, der noch mehr durcheinander ist: D .. leider bin ich nicht berechtigt, die Klassen zu ändern Ich bin nicht verantwortlich für :(. Ich bin nur verantwortlich für die Klasse A und ich kann nicht mehr als eine floatArray :(. Gibt es sowieso ich kann die Geschichte aller Ausgaben von Populator-Klasse speichern? – Pazuzu

+0

@Pazuzu Sie müssen Genauer gesagt: Wenn der von Ihnen aufgerufene Code * tatsächlich * ein neues Array zurückgibt, funktioniert die Verwendung eines lokalen Ordners. –

+0

Der Code, den ich anrufe, gibt kein neues Array zurück, sondern nur die vorherigen Werte des Arrays Werden die vorherigen Werte in der HashMap geändert? – Pazuzu

2

Jeder Eintrag in Ihrem Map hat einen Verweis auf das gleiche statische Feld floatArray als seinen Wert.

Statt floatArray als statischen Membervariable in A von mit berücksichtigen:

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

EDIT Auch weiß ich nicht, wie Sie den Code für die Klasse A würde kompilieren, wie es ist. Sollte nicht runEverySecond ein Populator Parameter statt Object nehmen? Siehe das überarbeitete Snippet oben.

+0

Hallo milkplusvellocet, Danke für deine Antwort. Dies ist nicht der eigentliche Code, es ist nur ein Beispielcode der realen Sache, und danke für den Hinweis auf den Fehler, den ich in Klasse A gemacht habe :), ja, Sie sind richtig, es sollte Populator und nicht Objekt sein. Jedenfalls habe ich Ihren Vorschlag ausprobiert und die Ergebnisse sind immer noch die gleichen :(. Ich möchte nur wissen, wie ich die Geschichte der generierten Werte beibehalten kann. Anstatt die HashMap zu verwenden, wenn ich ein normales Array, sagen wir von Größe 2, benutze Beispielcode Der Verlauf wird korrekt aufgezeichnet, aber nur für die letzten 2 Generationen Ich brauche eine Möglichkeit, alle Generationen zu speichern :) – Pazuzu

+0

Ich habe es gerade ausprobiert und es funktioniert genau wie erwartet. Könnten Sie _actual_ code posten, einschließlich der Änderungen, die Sie vorgenommen haben, nachdem ich geantwortet habe? Dann können wir Ihnen mehr helfen. – darrengorman

+0

Bitte werfen Sie einen Blick auf die Art der tatsächlichen Code oben. Danke für die Hilfe – Pazuzu