Ich hatte Bedarf an einer Warteschlange, aufgebaut mit einem Array als Ringpuffer.
Wegen Speicher und Performance wollte ich keine vorgefertigte Java-Collection verwenden, weil da für primitive Typen meist Wrapper-Objekte notwendig sind.
Klar, dass man zuerst mal eine Suchmaschine benutzt.
Bei den gefundenen Lösungen hat mich gestört, dass keine oder zu wenig Tests dabei waren.
Ausserdem, selbst gekocht schmeckt besser.
github.com
Das Problem beim Ringpuffer ist, dass man anhand der beiden Indexwerte zum Hinzufügen und zum Entnehmen nicht erkennen kann, ob bereits ein Überlauf erfolgte oder ob der noch kommt.
Nach einigem Rumprobieren bin ich auf dem Nachhauseweg auf folgende Lösung gekommen:
Ich führe beim Array-Zugriff immer ein Modulo auf den jeweiligen Index aus.
Dadurch bleibe ich sicher in den Array-Grenzen.
Ich lasse den Hinzufüge-Index über die Array-Grenze laufen, ist kein Problem wegen dem Modulo beim Zugriff.
So ist der Hinzufüge-Index immer größer als der Entnehm-Index.
Wenn auch der Entnehm-Index die Array-Grenze (0 bis Array-Größe - 1) verlässt, reduziere ich beide Indexe auf den Array-Bereich (Modulo).
Ich bewege mich also auf dem Zahlenstrahl ein Stück weiter, bleibe aber aufgrund des Modulo im Bereich des Arrays.
Das hat auf Anhieb geklappt und alle Tests waren grün.
In der Code-Coverage konnte ich sehen, dass einige Codezeilen zum Abfragen und Reduzieren nie benutzt wurden, die konnte ich entfernen.
Den alten Code (Zwischenstand) habe ich mit ins Repo eingecheckt.
Ich nehme an, dass meine Tests recht gut sind.
Es bleibt aber immer noch die Angst, dass ein Fehler drin ist.
Ich wäre sehr dankbar, wenn jemand einen Fehler entdeckt oder mir einen Hinweis gibt, wie ich die Fehlerfreiheit beweisen kann.
Danke
Wegen Speicher und Performance wollte ich keine vorgefertigte Java-Collection verwenden, weil da für primitive Typen meist Wrapper-Objekte notwendig sind.
Klar, dass man zuerst mal eine Suchmaschine benutzt.
Bei den gefundenen Lösungen hat mich gestört, dass keine oder zu wenig Tests dabei waren.
Ausserdem, selbst gekocht schmeckt besser.
GitHub - HeinerKuecker/Array-Ringbuffer-Queue-Java: A queue based on a ringbufferr, which in turn is based on a array
A queue based on a ringbufferr, which in turn is based on a array - HeinerKuecker/Array-Ringbuffer-Queue-Java
Das Problem beim Ringpuffer ist, dass man anhand der beiden Indexwerte zum Hinzufügen und zum Entnehmen nicht erkennen kann, ob bereits ein Überlauf erfolgte oder ob der noch kommt.
Nach einigem Rumprobieren bin ich auf dem Nachhauseweg auf folgende Lösung gekommen:
Ich führe beim Array-Zugriff immer ein Modulo auf den jeweiligen Index aus.
Dadurch bleibe ich sicher in den Array-Grenzen.
Ich lasse den Hinzufüge-Index über die Array-Grenze laufen, ist kein Problem wegen dem Modulo beim Zugriff.
So ist der Hinzufüge-Index immer größer als der Entnehm-Index.
Wenn auch der Entnehm-Index die Array-Grenze (0 bis Array-Größe - 1) verlässt, reduziere ich beide Indexe auf den Array-Bereich (Modulo).
Ich bewege mich also auf dem Zahlenstrahl ein Stück weiter, bleibe aber aufgrund des Modulo im Bereich des Arrays.
Das hat auf Anhieb geklappt und alle Tests waren grün.
In der Code-Coverage konnte ich sehen, dass einige Codezeilen zum Abfragen und Reduzieren nie benutzt wurden, die konnte ich entfernen.
Den alten Code (Zwischenstand) habe ich mit ins Repo eingecheckt.
Ich nehme an, dass meine Tests recht gut sind.
Es bleibt aber immer noch die Angst, dass ein Fehler drin ist.
Ich wäre sehr dankbar, wenn jemand einen Fehler entdeckt oder mir einen Hinweis gibt, wie ich die Fehlerfreiheit beweisen kann.
Danke