kleiner Ringbuffer für Strings
-
hi, ich hoffe ihr könnt mir weiterhelfen. bastel' gerade an einen kleinen chatclient rum und möchte mit der 'Pfeilnachobentaste' die letzten eingegebenen Strings in meinem textfield wieder anzeigen lassen (ähnlich ner shell oder einem irc-client).
es reicht wenn der Buffer 10 Strings speichert - wenn er voll ist, dann soll er wieder am anfang anfangen.
Gibts vielleicht schon was fertiges? StringBuffer speichert ja imho nur chars.habs mit einem array und positionszeigern probiert:
string[] buffer = new String[10]; int pufpos = 0; int lastreadpos = 0 //... //beim speichern: puffer[pufpos] = str pufpos++; if (pufpos == puffer.length - 1) pufpos = 0; lastreadpos = pufpos; //... //beim lesen gibts Probleme : lastpufpos--; for (int i = 0; (i < puffer.length) && puffer[lastpufpos].equals(null); i++) } if (lastpufpos == 0) nlastpufpos = puffer.length; lastpufpos--; } textfield.setText(puffer[lastpufpos]);
anscheinend darf ich nicht auf umbelegte (mit null belegte?) Positionen des Arrays zugreifen, da eine Nullponterexception geworfen wird. wieso eigentlich nicht? das ist doch kein C!?
gefallen tut mir diese Implementations nicht sehr - muss 2 Zeiger verwalten - geht das vielleicht irgendwie eleganter?
Freu mich über eure Vorschläge!
-
Ich habe in STS da einfach eine verkettete Liste genommen. Neue Texte immer am Anfang einfügen und den letzen löschen, wenn mehr als n Einträge.
Bye, TGGC (Der Held ist zurück)
-
äh was meinst du mit sts?
-
http://www.c-plusplus.net/forum/viewtopic.php?t=65034
Wenn die Mods jetzt zumache: "Ich hab nichts gemacht"
Bye, TGGC (Der Held ist zurück)
-
lol, muss ich jetzt das Spiel downloaden und den Bytecode angucken?
-
Hab schnell mal ein (billigen) Ringbuffer mit verketteten Elementen implementiert. Zumindest versucht - schlecht am Konzept ist momentan, dass die verkettete Liste von Anfang an schon 10 groß ist - der getString liefert deshalb auch die leeren zurück.
public class RingBuffer { int length = 10; boolean isNew = true; Element[] buffer; Element current; class Element { String value; Element previous; Element next; }; public RingBuffer(int length) { this.length = length; buffer = new Element[length]; for (int i = 0; i < length-1; i++) { buffer[i].value = ""; //!! Wirft Nullpointerexception!? buffer[i].next = buffer[i+1]; buffer[i+1].previous = buffer[i]; } buffer[0].previous = buffer[length]; buffer[length].next = buffer[0]; current = buffer[0]; } public void insertString (String str) { current.value = str; current = current.next; } public String getString (){ return current.previous.value; } public String getString ( int i) { Element temp = current; for (int j = 0; j < i; j++){ temp = temp.previous; } return temp.value; } }
Jedoch gehts net (siehe Code) Aber wieso?
-
ok, hab den Fehler gefunde. Wen es interessiert:
public class RingBuffer { int length = 10; boolean isNew = true; Element[] buffer; Element current; class Element { String value; Element previous; Element next; }; public RingBuffer(int length) { this.length = length; buffer = new Element[length]; for (int i = 0; i < length; i++) { buffer[i] = new Element(); buffer[i].value = ""; } for (int i = 0; i < length-1; i++) { buffer[i].next = buffer[i+1]; buffer[i+1].previous = buffer[i]; } buffer[0].previous = buffer[length-1]; buffer[length-1].next = buffer[0]; current = buffer[0]; } public void insertString (String str) { current.value = str; current = current.next; } public String getString (){ return current.previous.value; } public String getString ( int i) { Element temp = current; for (int j = 0; j < i; j++){ temp = temp.previous; } return temp.value; } }
Wer ne schönere Lösung hat - vor allem möcht ich die leeren Elemente überspringen (beim getten) - dann her damit
-
kann es sein, dass du gerade arrays und linkedlists durcheinander würfelst?
einen ringspeicher würde ich einfach mit einem array implementieren.
dafür musst du nur das ende und den anfang der daten speichern.wenn du zusätzlich zugriff über einen index willst, musst du den dann mit dem anfang und ende der daten verrechnen...
-
jo mag sein. Aber jetzt klappts so wie ichs mir vorgestellt hab:
public class RingBuffer { int length = 10; private int pos; Element[] buffer; Element current; class Element { String value; Element previous; Element next; }; public RingBuffer(int length) { this.length = length; buffer = new Element[length]; for (int i = 0; i < length; i++) { buffer[i] = new Element(); buffer[i].value = ""; buffer[i].next = null; buffer[i].previous = null; } current = buffer[0]; current.next = current; current.previous = current; } public void insertString (String str) { if (str.equals(current.value)) return; if ((pos < length -1) && (pos != 0)) { buffer[0].previous = buffer[pos]; current.next = buffer[pos]; buffer[pos].previous = current; buffer[pos].next = buffer[0]; } else if (pos == length -1) { current.next = buffer[0]; buffer[0].previous = current; } current = current.next; current.value = str; pos++; } public String getString (){ return current.previous.value; } public String getString ( int i) { Element temp = current; for (int j = 0; j < i-1; j++){ temp = temp.previous; } return temp.value; } }
-
Gumble schrieb:
lol, muss ich jetzt das Spiel downloaden und den Bytecode angucken?
Nein, nur wenn du wissen willst, was STS ist.
Bye, TGGC (Der Held ist zurück)