Unendlicher Ringbuffer (Queue)

yascod

Mitglied
Hallo Miteinander,

ich versuche gerade eine Aufgabe für die Uni zu lösen. Am besten Stelle ich die Komplette Aufgabe mal hier rein, dann wisst ihr bescheid was ich lösen muss.
1.png 2.png

Ich habe schon die Klasse QueueImpl programmiert und komme nicht weiter bei der Aufgabe a) wo ich die Methode push für die Klasse RingImpl machen muss. Leider verstehe ich nicht ganz was ein unendlicher Ringpuffer sein soll (Den normalen Ringpuffer verstehe ich). Außerdem wie soll ich denn die Objekte überprüfen ob sie schon im Ringpuffer drinnen sind für die Methode push? Ich würde mich um eure Hilfe freuen. Wenn ihr möchtet kann ich meinen Code zur QueueImpl noch posten, vielleicht wird es dadurch verständlicher (Sie funktioniert zumindest).
 

mihe7

Top Contributor

yascod

Mitglied
Was an der Erklärung in der Aufgabenstellung hast Du nicht verstanden?


Beispielsweise könntest Du über die Elemente im Ringpuffer iterieren und mit dem einzufügenden Element vergleichen.

Das mit "unendlich" verstehe ich nicht ganz. Muss das alles in einer endlos Schleife laufen? Hatte bevor ich hier gepostet habe, in google mal gesucht. Alle Codes die ich gefunden habe basieren auf den normalen ringpuffer und es wurde zum Beispiel in den Methoden einfügen so gemacht, dass eine if Bedingung vorhanden ist die überprüft ob der ringbuffer voll ist. Da hier aber unendlich fällt das ja weg..

Und iterieren könnte ich mit einer foreach Schleife richtig? Wie müsste der Inhalt in den klammern aussehen?
 

mihe7

Top Contributor
Der endliche Ringpuffer kann eine maximale Zahl an Elementen aufnehmen. Dies lässt sich sehr einfach mit einem Array implementieren, z. B. Object buf = new Object[10];

Der unendliche Rinpuffer hat keine fixe Größe, sondern wächst mit den Elementen einfach mit. Daher fällt die von Dir genannte Prüfung, ob der Ringpuffer voll ist, weg. Hierzu könnte man z. B. eine java.util.List-Implementierung verwenden - vermutlich sollt ihr das aber selbst implementieren.

Und iterieren könnte ich mit einer foreach Schleife richtig? Wie müsste der Inhalt in den klammern aussehen?

Ob Du das mit einem foreach-Konstrukt machen kannst, hängt von den von Dir verwendeten Datenstrukturen ab. Wenn Du foreach verwenden kannst:
Java:
public boolean contains(Object o) {
    for (Object elem : buffer) {
        if (elem.equals(o)) { // **
            return true;
        }
    }
    return false;
}
(** der Vergleich könnte theoretisch auch mit o == elem erfolgen, je nachdem, ob nur das selbe Objekt nicht doppelt eingefügt werden darf oder ob dies auch für gleiche Objekte gilt)
 

yascod

Mitglied
Der endliche Ringpuffer kann eine maximale Zahl an Elementen aufnehmen. Dies lässt sich sehr einfach mit einem Array implementieren, z. B. Object buf = new Object[10];

Der unendliche Rinpuffer hat keine fixe Größe, sondern wächst mit den Elementen einfach mit. Daher fällt die von Dir genannte Prüfung, ob der Ringpuffer voll ist, weg. Hierzu könnte man z. B. eine java.util.List-Implementierung verwenden - vermutlich sollt ihr das aber selbst implementieren.



Ob Du das mit einem foreach-Konstrukt machen kannst, hängt von den von Dir verwendeten Datenstrukturen ab. Wenn Du foreach verwenden kannst:
Java:
public boolean contains(Object o) {
    for (Object elem : buffer) {
        if (elem.equals(o)) { // **
            return true;
        }
    }
    return false;
}
(** der Vergleich könnte theoretisch auch mit o == elem erfolgen, je nachdem, ob nur das selbe Objekt nicht doppelt eingefügt werden darf oder ob dies auch für gleiche Objekte gilt)

Bei QueueImpl benutze ich die ArrayList kann ich die unendlichkeit damit machen?

hier mein Code zur QueueImpl:
Java:
import java.util.ArrayList;

@SuppressWarnings("serial")
public class QueueImpl extends ArrayList<Object> {
    int pos = 0;

    public void enqueue(Object item){
            add(pos, item);
            pos++;
    }

    public Object dequeue() throws QueueIsEmptyException {
        if (this.isEmpty()) {
            throw new QueueIsEmptyException("Queue ist leer");
        } else {
            if (pos > 0)
                pos--;
            return remove(0);
        }
    }

    public Object front() throws QueueIsEmptyException {
        if (this.isEmpty()) {
            throw new QueueIsEmptyException("Queue ist leer");
        } else {
            Object o = dequeue();
            add(0, o);
            pos++;
            return o;
        }
    }

    public boolean isEmpty() {
        return (pos == 0);
    }
}

Ich habe die Methode contains mal übernommen nur muss ich jetzt wie gesagt eine unendliche Liste zu Verfügung stellen am besten über QueueImpl, vielleicht da eine idee mit ArrayList? Und vielen vielen Dank für die schnellen Antworten.
 

mihe7

Top Contributor
Bei QueueImpl benutze ich die ArrayList kann ich die unendlichkeit damit machen?

Vergiss mal einen Moment den Ringpuffer.

Wenn Du ein Array hast, ist die Zahl der Elemente fix. Wenn Du ein Array mit 10 Elementen erzeugst, kannst Du in dieses Array keine 11 Elemente einfügen. Das Array ist also endlich.

Bei einer List hingegen ist das Hinzufügen der Elemente praktisch unbeschränkt. Du fängst mit einer leeren Liste an und fügst einfach eins nach dem anderen hinzu. Die Liste wird nie voll. Die Liste ist also "unendlich".

Eine ArrayList ist eine List, die zur Verwaltung der "unendlich vielen" Elemente endliche Arrays verwendet. Davon bekommst Du nach außen nichts mit. Intern kann das z. B. so realisiert werden, dass das aktuell verwendete Array ggf. durch ein neues Array mit größerer Kapazität ersetzt wird.

Ich habe die Methode contains mal übernommen nur muss ich jetzt wie gesagt eine unendliche Liste zu Verfügung stellen am besten über QueueImpl, vielleicht da eine idee mit ArrayList?

Die QueueImpl erweitert ArrayList, d. h. QueueImpl ist eine ArrayList" und damit bereits eine "unendliche Liste".

Das List-Interface bietet bereits contains an, da QueueImpl eine ArrayList ist, kannst Du einfach auf das bereits vorhandene contains zurückgreifen.

Vielleicht mal ein wenig Code als Startpunkt; ist natürlich nicht vollständig.

Java:
public class RingImpl {
    private QueueImpl queue = new QueueImpl();
    private int pos;

    public boolean contains(Object o) { return queue.contains(o); }
    public void push(Object o) { queue.add(pos, o); }
    public Object actual() { return queue.get(pos); }
    public void next() { pos = (pos + 1) % size(); }
    public boolean isEmpty() { return queue.isEmpty(); }
    public Object pop() { return queue.remove(pos); }
}
 

yascod

Mitglied
Vergiss mal einen Moment den Ringpuffer.
Die QueueImpl erweitert ArrayList, d. h. QueueImpl ist eine ArrayList" und damit bereits eine "unendliche Liste".

Das List-Interface bietet bereits contains an, da QueueImpl eine ArrayList ist, kannst Du einfach auf das bereits vorhandene contains zurückgreifen.

Vielleicht mal ein wenig Code als Startpunkt; ist natürlich nicht vollständig.

Java:
public class RingImpl {
    private QueueImpl queue = new QueueImpl();
    private int pos;

    public boolean contains(Object o) { return queue.contains(o); }
    public void push(Object o) { queue.add(pos, o); }
    public Object actual() { return queue.get(pos); }
    public void next() { pos = (pos + 1) % size(); }
    public boolean isEmpty() { return queue.isEmpty(); }
    public Object pop() { return queue.remove(pos); }
}

Ich habe aber kein contains in QueueImpl. Ich habe jetzt in QueueImpl eine
Java:
ArrayList<Object> buffer;
eingefügt. Und ich habe ja schon ein int pos = 0 in QueueImpl, ist es also noch nötig die int pos in die RingImpl reinzuschreiben? Ich habe hier mal weiter gemacht, weiß aber nicht genau ob mein push, pop und next richtig ist bzw. fällt dir vielleicht was anderes auf?

Java:
public class RingImpl extends QueueImpl {
    private QueueImpl queue = new QueueImpl();
    private int pos;

  
    public boolean contains(Object index){
        for (Object elem : buffer) {
            if (elem.equals(index)) {
                return true;
            }
        }
        return false;
    }
  
  
    public void push(Object index) throws QueueIsEmptyException {
        if (this.isEmpty()) {
            throw new QueueIsEmptyException("Ringbuffer ist leer");
        } else {
            if (!contains(index)) {
            queue.enqueue(index);
            }
        }
    }

    public Object pop() throws QueueIsEmptyException {
        if (queue.isEmpty()) {
            throw new QueueIsEmptyException("Ringbuffer ist leer");
        } else {
            Object index = queue.dequeue();
            return index;
        }

    }

    public Object actual() throws QueueIsEmptyException {
        if (queue.isEmpty()) {
            throw new QueueIsEmptyException("Stack ist leer");
        } else {
            return queue.front();
        }
    }

     public void next() {
         queue.pos = (queue.pos + 1) % size();
       
     }
  
    public boolean isEmpty() {
        return queue.isEmpty();
    }

    public static void main(String[] args) throws QueueIsEmptyException {

    }
}
 

yascod

Mitglied
Hab es mal in der Main getestet funktioniert nicht :(. Nullpointer Exception bei der Methode contains und der pusht auch gar nix rein, ich mache irgendwas an den Objekten falsch, glaube ich zumindest.
 
X

Xyz1

Gast
Ich bringe mal etwas Licht hier rein.
Ein "unendlicher" Ringpuffer kann auch ein Array mit fester Länge sein, das nicht vergrößert wird.

Am besten Stelle ich die Komplette Aufgabe mal hier rein, dann wisst ihr bescheid was ich lösen muss.
Das ist schön aber gleichzeitig so mies zu erkennen das Du Dir das auch sparen hättest können.
 

yascod

Mitglied
Ich bringe mal etwas Licht hier rein.
Ein "unendlicher" Ringpuffer kann auch ein Array mit fester Länge sein, das nicht vergrößert wird.


Das ist schön aber gleichzeitig so mies zu erkennen das Du Dir das auch sparen hättest können.

Wenn das jetzt wegen der Qualität gemeint ist auf dem PC ist es leserlich genug, sollte eigentlich keinen Problem darstellen.
 
X

Xyz1

Gast
Hääääää???? Verstehst Du nicht was ich sagte? Die Qualität ist unter aller sau das kannst Du behalten.
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
Ich habe aber kein contains in QueueImpl.
Nochmal: QueueImpl erweitert ArrayList, damit erbt QueryImpl die contains-Methode von ArrayList.

Und ich habe ja schon ein int pos = 0 in QueueImpl, ist es also noch nötig die int pos in die RingImpl reinzuschreiben?

Ja. Das eine ist die Position, die zur Verwaltung der Queue benötigt wird, das andere die Position für den Ringpuffer. Du kannst das Feld aber gerne umbenennen:

Java:
public class RingImpl {
    private QueueImpl queue = new QueueImpl();
    private int pointer;

    public boolean contains(Object o) { return queue.contains(o); }
    public void push(Object o) { queue.add(pointer, o); }
    public Object actual() { return queue.get(pointer); }
    public void next() { pointer = (pointer + 1) % size(); }
    public boolean isEmpty() { return queue.isEmpty(); }
    public Object pop() { return queue.remove(pointer); }
}

Ich habe es nicht getestet, aber für die meisten Fälle sollte diese Implementierung funktionieren, die Sonderfälle solltest Du aber schon noch selbst behandeln.
 

yascod

Mitglied
Hääääää???? Verstehst Du nicht was ich sagte? Die Qualität ist unter aller sau das kannst Du behalten.
Manchmal denke ich ich rede mit einem Toastbrot.... :(
Dann wird es mal Zeit eine Brille zu benutzen, deine Hilfe und Kommentare kannst du dir sparen du "Foren-Gangster"! Und zum Toastbrot würde ich jetzt noch was sagen aber hey ich kann wohl besser denken als du, ist es nicht wert ;)
 

yascod

Mitglied
Nochmal: QueueImpl erweitert ArrayList, damit erbt QueryImpl die contains-Methode von ArrayList.



Ja. Das eine ist die Position, die zur Verwaltung der Queue benötigt wird, das andere die Position für den Ringpuffer. Du kannst das Feld aber gerne umbenennen:

Java:
public class RingImpl {
    private QueueImpl queue = new QueueImpl();
    private int pointer;

    public boolean contains(Object o) { return queue.contains(o); }
    public void push(Object o) { queue.add(pointer, o); }
    public Object actual() { return queue.get(pointer); }
    public void next() { pointer = (pointer + 1) % size(); }
    public boolean isEmpty() { return queue.isEmpty(); }
    public Object pop() { return queue.remove(pointer); }
}

Ich habe es nicht getestet, aber für die meisten Fälle sollte diese Implementierung funktionieren, die Sonderfälle solltest Du aber schon noch selbst behandeln.


Hey danke für die Hilfe ich schaue mir das nochmal an und melde mich. Vielen Dank für deine Hilfe und Verständnis!
 

Thallius

Top Contributor
Ich finde ein unendlicher Ring buffer ist irgendwie en paradoxum. Ein Ring buffer ist immer unendlich das sagt ja schon der Name...
 

yascod

Mitglied
Ich find es immer gut zu sehen wie jemand denkt er sei besser als ich. :D


Gern.
Brauchst du eine Bestätigung dafür? Oder musst du dir das jedes Mal dir selber beweisen, dass du besser als andere bist? Ich habe echt Mitleid mit dir:rolleyes:. Das Traurige dabei ist, bestimmt bist du als Mensch so ein hoffnungsloser Fall, soviel Ego und Selbstliebe, da kann weder ein anderer noch du selbst dich glücklich machen ;).

Auf nimmer Wiedersehen !
 
X

Xyz1

Gast
Brauchst du eine Bestätigung dafür? Oder musst du dir das jedes Mal dir selber beweisen, dass du besser als andere bist? Ich habe echt Mitleid mit dir:rolleyes:. Das Traurige dabei ist, bestimmt bist du als Mensch so ein hoffnungsloser Fall, soviel Ego und Selbstliebe, da kann weder ein anderer noch du selbst dich glücklich machen ;).
Schon ziemlich viele Unterstellungen für jemanden der den Rat meiner Person oder des Forums sucht....

Du hältst Dich nicht ernsthaft für was Besseres :p
 

yascod

Mitglied
Schon ziemlich viele Unterstellungen für jemanden der den Rat meiner Person oder des Forums sucht....

Du hältst Dich nicht ernsthaft für was Besseres :p
Um deinen Rat habe ich nicht gebeten, nochmal anscheinend hast du es ja nicht verstanden, behalte deine Ratschläge und Kommentare. Und meine Unterstellungen sind schon gut begründet, lern du erstmal wie man mit seinem Gegenüber zu sprechen hat. Und nein ich halte mich nicht was für besseres nur kann ich solche Menschen wie dich nicht für voll nehmen. Tue dir selber einen Gefallen und antworte einfach nicht mehr ;)
 
X

Xyz1

Gast
@yascod
Nein, Du hast Deine Position verkannt. Ganz einfach.
Du bist derjenige der eine Frage an uns stellt nicht umgekehrt.
Zudem hast Du anscheinend nicht gelesen, Wie man fragen Richtig stellt, Vor dem ersten Posten usw.
Ich finde Verständnisschwierigkeiten sind nicht schlimm,
aber bei diesen absoluten Anfängerfragen (nachdenk....)
Was wolltest Du nochmal machen? Etwas in richtung Programmieren oder doch besser etwas anderes (Malen, Zeichnen, Singen, Taxifahren etc) was etwas anspruchsvoller wäre?
Nicht jeder kann alles Wissen, aber Lern- und Kritikfähigkeit oder auch nur die Basics, kann ich bei Dir nicht erkennen.
 

yascod

Mitglied
@yascod
Nein, Du hast Deine Position verkannt. Ganz einfach.
Du bist derjenige der eine Frage an uns stellt nicht umgekehrt.
Zudem hast Du anscheinend nicht gelesen, Wie man fragen Richtig stellt, Vor dem ersten Posten usw.
Ich finde Verständnisschwierigkeiten sind nicht schlimm,
aber bei diesen absoluten Anfängerfragen (nachdenk....)
Was wolltest Du nochmal machen? Etwas in richtung Programmieren oder doch besser etwas anderes (Malen, Zeichnen, Singen, Taxifahren etc) was etwas anspruchsvoller wäre?
Nicht jeder kann alles Wissen, aber Lern- und Kritikfähigkeit oder auch nur die Basics, kann ich bei Dir nicht erkennen.

Erstens gibt es keine dummen Fragen sondern dumme Antworten. Und es ist kein vergehen wenn man was nicht versteht oder kann, jeder fängt irgendwann und niemand kann alles von Geburt aus. Das Problem ist du bist als Menschliches Wesen anscheinend sehr schwach. Da deine Antwort ganz am Anfang einfach daneben war. Sich über Leute lustig zu machen, zeigt einfach wie Charakterlos du bist. Deswegen jetzt zum dritten Mal hör auf zu schreiben, weder deine Kommentare noch deine Aussagen brauche ich. Der andere Gruppenmitglied konnte auch normal antworten. Hättest du von anfang an nicht so frech geantwortet wäre das nie so in die Länge gekommen. Und ich brauche mir auch nicht anzuhören was du über mich denkst, denn es ist mir so ziemlich egal, der Ton einer kleinen Mücke ist mir sogar mehr recht glaube mir ;)

PS:Und bitte Spam nicht mehr meine Frage voll.
 
X

Xyz1

Gast
Wo war denn ein persönlicher Angriff meinerseits? Der @yascod bezeichnet die einzig richtige Antwort als Blödsinn. Stattdessen sollte er lieber mal die Schmiererei auf der ersten Seite erklären.
 

yascod

Mitglied
Wo war denn ein persönlicher Angriff meinerseits? Der @yascod bezeichnet die einzig richtige Antwort als Blödsinn. Stattdessen sollte er lieber mal die Schmiererei auf der ersten Seite erklären.

Wie war das noch mit Selbstkritik? Deine Aussage zu du hattest als einzig die richtige Antwort zeigt wieder einmal wie erbärmlich du bist und selbstverliebt. Aber soviel Genugtuung soll dir mal reichen jetzt. Der Moderator hat recht, ich habe dir zu viel Aufmerksamkeit geschenkt. Meinerseits Entschuldigung an alle anderen Foren Mitglieder und dem Moderator, dass ich dich nicht ignoriert habe und sachlich beim Thema geblieben bin.
 

yascod

Mitglied
Und gleich noch einen hinterher:



Das Erweitern von QueueImpl widerspricht der Anforderung lt. Aufgabenstellung, dass RingImpl ein Objekt der Klasse QueueImpl aggregieren soll.

So zum Thema zurück. Ich glaube ich weiß wie ich das jetzt angehen muss, werde aber Heute nicht mehr dazu kommen. Ich melde mich wenn ich weitergekommen bin. Danke dir nochmal für deine Hilfe.
 

Robat

Top Contributor
@yascod man kann User hier auch ignorieren (Auf den Namen des Nutzers klicken -> ignorieren) .. dann geht man solchen nutzlosen Konversationen aus dem Weg ;)
 

Thallius

Top Contributor
Dafür würde mich die Begründung interessieren...

Ein Ring hat kein Anfang und kein Ende. Er ist also unendlich. Es sollte also vielleicht mal genauer definiert werden was in dem Fall der aufgabe das unendlich eigentlich bedeutet? Vielleicht ist ja gemeint, dass der buffer unendlich erweiterbar ist. Dann braucht man aber auch eigentlich keinen Ringbuffer. Einsatzzweck eines Ringbuffers ist es doch in der Regel, das man ein sich selbst überschreibenden Buffer mit einer konstanten Größe hat bei dem, wenn der letzte Platz belegt ist und man ein weiteres Element einfügt, das erste Element überschrieben wird. Alles andere macht in meinen Augen keinen wirklichen Sinn.

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Das hängt dann wohl sehr von der Definition von Unendlich ab...ich würde einen Ring jetzt nicht als unendliche Datenstruktur bezeichnen (vor allem, da sie ja auch laut deiner Definition nur eine endliche Menge an Werten fassen können).
Aber das Verhalten, dass alte Elemente überschrieben werden, ist keineswegs so für einen Ringpuffer definiert - der darf durchaus auch wachsen.

Oder kommt etwa wirklich jemand auf die Idee, ein Array der Länge 0 als unendlich zu bezeichnen? Hat auch kein erstes oder letztes Element :p
 

Thallius

Top Contributor
der haupteinsatzzweck für einen ringbuffer liegt für mich z.b. in einem Cache. Hier definiert man i.d.R. Eine Größe und wenn der buffer voll ist, dann wird er halt von vorne überschrieben. Deshalb ringbuffer.
Das man diesen natürlich auch dynamisch größer und kleiner machen kann um eben mehr oder weniger Cache Speicher zu haben ist klar, der buffer wird aber eben nicht dynamisch den benötigten Elementen angepasst und da liegt meiner Meinung nach der Unterschied zu einer klassischen Liste.
Von daher macht für mich ein unendlicher ringbuffer, bei dem unendlich so definiert wird, das er sich unendlich vergrößern kann wenn mehr Elemente benötigt werden, keinen Sinn, denn in dem Fall werde ich nie den eigentlich nutzen eines ringbuffers verwende.

Gruß

Claus
 

mihe7

Top Contributor
Ringpuffer eignen sich z. B. auch für die Implementierung von Queues. Diese können durchaus dynamisch wachsen (so lange der Puffer voll ist), gleichzeitig wird der Speicher der Elemente wiederverwendet, die der Queue entnommen wurden.
 

Thallius

Top Contributor
Ringpuffer eignen sich z. B. auch für die Implementierung von Queues. Diese können durchaus dynamisch wachsen (so lange der Puffer voll ist), gleichzeitig wird der Speicher der Elemente wiederverwendet, die der Queue entnommen wurden.

Für sowas für ich immer eine Liste nehmen, einen Vuffer macht da keinen Sinn

Gruss

Claus
 

Thallius

Top Contributor
Warum sollte das keinen Sinn machen?

Weil Du keinen Vorteil damit generierst. Im Gegenteil. Du must sogar jedesmal nachsehen ob noch Platz in Deinem Buffer ist und wenn nicht, dann must du ihn erweitern. Dann doch lieber gleich eine Liste die immer den neuen Eintrag hinten dran hängt und jeden der bearbeitet wird löscht. Ist doch auch wesentlich einfacher zu verstehen.
 

mihe7

Top Contributor
Du must sogar jedesmal nachsehen ob noch Platz in Deinem Buffer ist und wenn nicht, dann must du ihn erweitern.
Dynamik gibt es nun einmal nicht kostenlos, auch bei der Liste nicht. Die Liste muss den Speicher ständig verwalten (an einem Ende hinzufügen, am anderen entfernen), der Ringbuffer muss lediglich prüfen, ob er voll ist und nur dann erweitert werden.
 

Thallius

Top Contributor
Ich glaube Du hast dich nie mit Speicherverwaltung beschäftigt. Bei einer Liste wird einfach ein alloc() gemacht und dann ein Zeiger vom letzten Element der Liste auf das neue Element gesetzt. Der Speicher der Liste kann beliebig im RAM verteilt sein. Da muss nichts "verwaltet" werden.
 

Blender3D

Top Contributor
Bei einer Liste wird einfach ein alloc() gemacht und dann ein Zeiger vom letzten Element der Liste auf das neue Element gesetzt. Der Speicher der Liste kann beliebig im RAM verteilt sein. Da muss nichts "verwaltet" werden.
Das alloc() kümmert sich um das Verwalten des Speichers. --> Es muss verwaltet werden. ;)
Ein Grundgesetzt das nie gebrochen werden kann.
Jeder Vorteil bringt immer einen Nachteil mit sich.
Würde das Gesetzt z.B. bei Arrays und Listen nicht gelten dann bräuchte man die Variante nicht mehr die nur Nachteile hat.
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Generell hast du recht aber gerade bei einer Quque wird ja immer das neue Element and das Ende der Liste gehängt und das erste Element heraus genommen. Damit fallen alle Nachteile der Liste gegenüber dem festen array (was ein buffer ja dann wäre) weg
 

yascod

Mitglied
So alles klappt jetzt, hab es doch hinbekommen. Jedoch habe ich ne Frage zu Aufgabe b, ich soll ja eine sinnvolle Exception implementieren, die in mindestens drei Methoden von RingImpl auftreten kann. Habt ihr eine Idee was sinnvoll wäre? Denn Ringpuffer ist leer gibt es ja schon und Ringpuffer ist voll würde ja nicht gehen, da unendlich und was anderes fällt mir ehrlich gesagt nicht ein.
 

mihe7

Top Contributor
@Thallius Der Unterschied zwischen Deiner Linked List und meinem Ringbuffer besteht im Wesentlichen darin, dass das letzte Element der Linked List keinen Nachfolger hat, während beim Ringbuffer jedes Element einen Nachfolger besitzt. Außerdem gibt es bei der Implementierung einer Queue via RingBuffer einen Head- und einen Tail-Zeiger.

Wir können uns ja mal die Operationen ansehen:

I. Einen Wert in die Queue einstellen auf Basis einer Linked List:
1. Speicher für den neuen Eintrag reservieren
2. Wert des neuen Eintrags setzen
3. Zeiger des letzten Eintrags auf neuen Eintrag setzen

II. Einen Wert aus der Queue entnehmen auf Basis einer Linked List:
1. ergebnis := Wert des ersten Eintrags
2. den Zeiger auf das erste Element der Liste aktualisieren
3. Speicher des vormals ersten Eintrags freigeben

Die Schritte aus I. wären bei einer Implementierung mit Hilfe eines "unendlichen" Ringbuffers auch notwendig - aber nur, wenn der Platz ausgeht. Ansonsten reicht es, die Head- und Tail-Zeiger anzupassen, weil dann die bereits vorhandenen Einträge verwendet werden. Der Speicher dieses Ringbuffers muss erst freigegeben werden, wenn er (Ringbuffer) nicht mehr benötigt wird.

Bei der Linked List muss bei I. und II. Speicher angefordert bzw. freigegeben werden.
 

mihe7

Top Contributor
@yascod Naja, was ist denn z. B. das nächste/aktuelle Element einer leeren Liste? Und was das Hinzufügen von Objekten betrifft: null ist kein Objekt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W GET Anfrage resultiert in unendlicher Antwort Java Basics - Anfänger-Themen 1
S Ringbuffer-Speicher mit einem Textfile Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Vererbung Queue bestehend aus Superclass- und Subclass-Objekten Java Basics - Anfänger-Themen 7
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
J Java Queue mit default Werten erstellen Java Basics - Anfänger-Themen 4
P Priority Queue Performance Java Basics - Anfänger-Themen 3
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
F Queue zyklisch Java Basics - Anfänger-Themen 8
D Queue vs. Stack Java Basics - Anfänger-Themen 6
L Queue mithilfe von 2 Stacks erstellen Java Basics - Anfänger-Themen 1
B Automatisierung von Jobs / @EJB Scheduler / Verhinderung, dass Queue überläuft Java Basics - Anfänger-Themen 2
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
J Queue Warteschlange Java Basics - Anfänger-Themen 3
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
H Collections StackOverflowError in einer Queue Java Basics - Anfänger-Themen 3
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
JokerBlacky Klassen Klasse Queue Klasse mit Attributen anhängen und auslesen können Java Basics - Anfänger-Themen 4
K Queue enq Fehler Java Basics - Anfänger-Themen 2
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
A Queue (Array) leeren Java Basics - Anfänger-Themen 1
F HTTP Get Queue Java Basics - Anfänger-Themen 7
J Queue zyklisch auslesen Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
T Priority-Queue Java Basics - Anfänger-Themen 9
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
P Array queue problem Java Basics - Anfänger-Themen 1
L Queue programmieren via BlueJ Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
I Erste Schritte Queue Java Basics - Anfänger-Themen 14
G Queue auf einer Seite löschen, andre Seite schreiben Java Basics - Anfänger-Themen 3
G Queue mit int oder float Java Basics - Anfänger-Themen 3
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
P Priority Queue Java Basics - Anfänger-Themen 6
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
S Fehler beim Auslösen des ActionListeners in Verbindung mit einer Queue Java Basics - Anfänger-Themen 5
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
T Collections Queue<? extends Number> add() offer() Java Basics - Anfänger-Themen 13
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
B Queue problem! Java Basics - Anfänger-Themen 2
R Queue abhören und Message in Browser ausgeben Java Basics - Anfänger-Themen 3
T Erstellung von Queue mit verkketten listen Java Basics - Anfänger-Themen 3
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
K Priority Queue - wo ist denn jetzt der Vorteil? Java Basics - Anfänger-Themen 7
W Iterator in Queue Java Basics - Anfänger-Themen 5
Q An erste Stelle in eine Queue eintragen Java Basics - Anfänger-Themen 4
H Stack und Queue Java Basics - Anfänger-Themen 6
M Threadsichere Queue in Java 1.5? Java Basics - Anfänger-Themen 2
G Int-Queue in String-Queue umwandeln Java Basics - Anfänger-Themen 5
A Queue erweitern Java Basics - Anfänger-Themen 13
P Queue, Stacks, Listen Java Basics - Anfänger-Themen 7
S Queue als Array implementiert get()? Java Basics - Anfänger-Themen 4
S Queue als verkettete Liste Java Basics - Anfänger-Themen 9
S Queue Java Basics - Anfänger-Themen 30
K Prüfen, ob Queue leer ist Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben