Hallo, ich verzweifle gerade an etwas vermutlich Banalem:
Ich habe in meinem Programm eine Art Schlange fester Länge drin (IrgendJemand kennt bestimmt das Fachwort dafür):
Ich habe ein String Array der Länge 16 (eigentlich würde es auch ein char array tun da nur „Z“,„R“;„S“ und „U“ vorkommen; will mich aber nicht mit ascii code vs buchstabe rumärgern, aber das nur am Rande).
Naturgemäß ist diese maximal 16 Sachen umfassende Schlange eingangs leer (ich initialisiere alle 16 Positionen mit „U“ für unbekannt.)
Dann soll pro runde eine Farbe („R“,„S“ oder „Z“) hinzugefügt werden können.
Sollte die Schlange schon voll sein, also 16 strings ungleich „U“ sein, dann soll das älteste Element durch die neue Farbe ersetzt werden.
Klar könnte ich nun hingehen im array alles „eins nach unten schieben“ und die 0te position mit dem neuen String belegen.
Ist aber performance technsich unschön, daher benutze ich eine „cycling queue“ (oder so ähnlich hieß das Teil).
ich habe also wie gesagt das 16 Strings umfassende array und einen cursor, der auf das aktuellste Element im array zeigt.
das Element unterm Cursor und die aufsteigend (modulo 16) folgenden 15 Elemente sind dann eben die aktuelle Schlange.
Langes vorgerede aber ich scheitere gerade am hinzufügen eines neuen Strings.
Habe mir eine Methode gebaut, der man den neuen String übergibt.
Im Prinzip muss ja nur der Cursor um 1 runtergesetzt werden (halt modulo 16, heißt war der cursor vorher auf index 0, dann ist er danach auf index 15)
und an der (neuen) cursorposition muss der string ausgetauscht werden.
der cursor ist halt ein int, der als objektattribut vorhanden ist (und bei objekterzeugung mit 15 initialisiert wurde. sprich, ich fülle von oben nahc unten auf eingangs) und in der methode um eins runtergesetzt werden soll.
code sieht wie folgt aus, stark eingeschränkt auf das Wichtige:
(Da sind noch zwischendrin 200 ineinander verschachtelte Methoden, die sich gegenseitig aufrufen und eine davon ruft halt die addcolor auf.
Man kann davon ausgehen dass da ganz korrekt ein string der methode übergeben wird, also am restlichen kram scheitert es sicher nicht.)
public class Test {
String[] Colors=new String[16]; //Array der letzten 16 gezogenen Farben
int NewIndex=15;//index of the last drawn color
double[] et,ft; //nächste Einsätze et=Farbe, ft=Null
double[] einsbut={0.1,0.5,1,2,5,10,25,50,100,500,1000};
Robot bot = new Robot();
Map EZP = new HashMap(); //einsätze->indec
Map VTK = new HashMap(); //index->einsätze
int currwheelpos=2;//left most position of the visible wheel right now, 5 pos visible at once
public static void main(String[] args)throws AWTException, InterruptedException{
//Disbale scaling??
//System.setProperty( "sun.java2d.uiScale", "1.0" );
//Start Timetracking
Test a=new Test();
}
//Konstruktor und andere Methoden hier
//fertig
public void addColor(String color){
NewIndex= (NewIndex-1>=0) ? (NewIndex--) : (NewIndex=NewIndex+15);
Colors[NewIndex]=color;
}
}
Aus Tests weiß ich dass zwr erfolgreich die Farbe ausgetauscht wird, aber der Cursor einfahc nicht um 1 verkleinert wird.
Heißt, als resultat verändert die methode immer nur das selbe element anstatt bei jedem aufruf um eins runter zu gehen und jenes element zu ändern.
weil eben newindex nichtv errignert wird wie hingeschrieben!
Weiß Jemand woran das liegen könnte oder wie ich es besser mache?
Die umsetzung als objektattribut erscheint mir aktuell die sinnhafteste Art diesen Counter von überall zugreifbar zu halten.
Nur meine Vermutung aber kann es an irgendetwas Schwachsinnigem liegen wie „innerhalb einer Methode kann ein Objektattribut nicht geändert werden“ oder sowas? O_o