verlinkte Liste mit generics

Mark3108

Mitglied
Hallo alle zusammen...

ich möchte eine einfach verlinkte Liste in Java basteln. Dabei soll das letzte element nicht mit null gekennzeichnet sein, sondern wieder auf das Erste zeigen. Einfach deshalb das ich ein element aus der Liste nehmen kann ohne die Liste kennen zu müssen.

Folgende Datenstrukturen hab ich jetzt angelegt:

ACHTUNG addToQueue() und getItem sind nur dummies zum testen...

Code:
public abstract class TObjectQueueItem<ObjectQueueItem extends TObjectQueueItem<?>> 
{
	protected ObjectQueueItem FObjectLink;

	public TObjectQueueItem()
	{
		FObjectLink = (ObjectQueueItem)this;
	}
	
	public void addToQueue(ObjectQueueItem aItem)
	{
		FObjectLink = aItem;
	}
	
	public ObjectQueueItem getItem()
	{
		return FObjectLink;
	}
}


public class TObjectQueue<ObjectQueueItem extends TObjectQueueItem<?>> extends TObjectQueueItem<ObjectQueueItem>
{
	public TObjectQueue()
	{
		super();
	}
}

ACHTUNG addToQueue() und getItem sind nur dummies zum testen...

TObjectQueueItem repräsentiert ein Element in der Liste. FObjLink ist der ptr auf das nächste Objekt. Dieser wird parametrisiert mit ObjectQueueItem welches zumindest von TObjectQueueItem erben muss... soweit so gut.

Erste Frage:

was bedeutet das <?> in der Zeile
"class TObjectQueueItem<ObjectQueueItem extends TObjectQueueItem<?>>"

Ich hab das nur hingemacht weil ich ansonsten ne warning bekomme da ich ObjectQueueItem nicht parametrisiert hab. Aber ich weiß ja an der Stelle noch nicht was <?> sein wird...


Zweite Frage:

Also TObjectQueue ist jetzt meine Liste und erbt von TObjectQueueItem. Dabei ist FObjLink der ptr auf das erste Element bzw auf die Liste selbst wenn sie leer ist. Und genau das ist das Problem. FObjLink ist ja parametrisiert und zeigt auf irgendein "höheres" Object. Wenn ich den jetzt auf die Liste selbst zeigen lassen will, gibt das ne Exception weil Java das implizit auf Typkompatibilität prüft.

Ich möchte aber TObjectQueue allgemein halten. Sprich da soll nur ein ptr aufs erste Object stehen und halt generische Methoden um was mit der Liste zu machen. Deshalb kann TObjectQueue nicht von "ObjectQueue" abgeleitet sein. Oder seh ich das falsch?

Liegt der Fehler jetzt in meinem Ansatz? Also denk ich falsch? Würde man das anders machen?
Gibt es in Java auch die Möglichkeit Objekte zu casten ohne das überprüft wird ob die kompatibel sind?

Hoffe ich konnte einigermaßen rüber bringen was ich machen will und wo das Problem liegt.

lg
 

Marco13

Top Contributor
So halb...

Das <?> bedeutet nur, dass die Klasse "irgendeinen" Typ-Parameter hat, aber an dieser Stelle nicht bekannt ist, welcher das sein soll.

Das zweite... muss ich morgend ggf. mal testen, vielleicht wird (mir) dann klarer, was du meinst.
 

Mark3108

Mitglied
Ok ich versuche es nochmal zu verdeutlichen...

Bei einer klassischen verketteten Liste ist das letzte Element dadurch gekennzeichnet das der next ptr null ist. Die Liste selbst kann also aus einem simplen ptr auf das erste Objekt repräsentiert werden.

list--->objekt1--->objekt2--->objekt3--->null

Dabei kann list vom gleichen Typ wie objekt1 sein. Ist die liste leer dann ist list einfach null. list ist also keine Instanz sondern nur ein ptr auf ein Objekt.

Das ist simpel und funktioniert. Das Problem dabei: Ich muss die Liste, sprich den ptr auf das erste Objekt kennen um ein Objekt aus der Liste nehmen zu können. Wenn ich Objekte aus einer Liste nehmen können will, ohne die Liste zu kennen, brauch ich entweder eine doppelt verkettete Liste, sodass ich den Vorgänger kenne, oder ich mache es mit der einfach verketteten Liste und lasse den next ptr des letzten Objektes auf das erste Objekt zeigen. Dann kann ich mit "listItem.reclaim()" - Name gerade erfunden - das listItem aus der Liste entfernen ohne diese zu kennen. Ich muss nur einmal im Kreis laufen, bis ich ein Objekt habe dessen next ptr auf mein zu entfernendes Objekt zeigt. Alles von der Logik kein Problem.

Das führt nur dazu dass ich die Liste nicht mehr simpel durch einen ptr auf das erste Objekt repräsentieren kann, da eine leere liste auf sich selbst zeigen muss.

--->list.next---
| | leere Liste
---------------

--->list.next--->Objekt1--->Objekt2--->Objekt3---
| | liste mit drei Objekten
--------------------------------------------------

In diesem Fall ist list, im Gegensatz zum letzten Beispiel, schon eine Instanz deren next ptr erst auf das erste Objekt zeigt.
Ich brauche also ein Objekt mehr um eine Liste mit gleicher Anzahl von Elementen darzustellen. Wenn das schon so ist, dann sage ich eben es gibt zu den Typen ListItem eben noch einen Typ List. Das ist ja nicht so doof.
Wie sieht dieser Typ rein von der Datenstruktur aus?
Also für mich hat er erstmal nur einen first/next ptr. Also wie jedes ListItem auch. Also leite ich list, sinnvollerweise von listItem ab. Das Problem ist jetzt das die nextPtr ja parametrisiert werden. Die next ptr sind also von einem Typen der zwar von ListItem erbt aber dieses auch erweitert. Wenn ich jetzt den next ptr von Objekt3 auf list zeigen lassen will, stimmen die Typen nicht überein, da list vom Typ TList extends TListItem ist und der next ptr von Objekt3 vom Typ TExtendedListItem extends ListItem ist. Das gibt dann bei java eben ne Exception.

Abhilfe?
Naja man könnte List von dem konkreten Typ der ListItems erben lassen. Finde ich aber total doof, da dann die Liste Felder hat die sie nicht brauch, und was viel schlimmer ist, ich kann das nicht generisch implementieren. Ich will ja einen Typ List habe von dem nur bekannt ist das er einen next/first ptr hat der auf das erste Objekt zeigt. Vielleicht noch ein paar Methoden die man allgemein für so eine Liste vereinbaren kann.
Ich frage mich jetzt ob das ein Fehler in meiner Denkweise ist und man sowas einfach anders implementieren würde.
 

Marco13

Top Contributor
:bahnhof: Ich versteh's nicht - ich kann nicht filtern, was von dem, was du geschrieben hast, nur allgemeines Gelaber ist, und was tatsächlich mit dem Problem zu tun hat, und was vermeintliche Lösungsansätze sind (evtl. um Probleme zu lösen, die gar nicht existieren). Vielleicht versteht's irgendjemand anderes, oder du versuchst mal, das so zu schreiben, als wüßtest du selbst nicht, worum es da geht...
 

Andi_CH

Top Contributor
Ok ich versuche es nochmal zu verdeutlichen...

Bei einer klassischen verketteten Liste ist das letzte Element dadurch gekennzeichnet das der next ptr null ist. Die Liste selbst kann also aus einem simplen ptr auf das erste Objekt repräsentiert werden.

list--->objekt1--->objekt2--->objekt3--->null

NIEMAND behauptet, dass der letzte pointer nicht wieder auf das erste Element zeigen darf
Die Objekte müssen einfach eine gemeinsame Vaterklasse haben, die next und previous enthält

Die leere Liste ist dann, wenn list == null ist

Das erste Element ist referenziert durch list
Das letzte Element durch list.previous

Also wo ist das Problem? (Aber bitte schreib nicht wieder eine halbe Dissertation - wir möchten nicht 100 Zeilen filtern bis wir irgendwo eine Problembeschreibung finden)

Das ganze nennt sich Ringbuffer:

google treffer 1

google treffer 2
 

Marco13

Top Contributor
Irgendwie klang das mit dem Zeiger auf's erste Element nach einem Versuch, sowas wie
einElement.löscheDichAusDerListeInDerDuBistOhneDassIchDieInstanzDieserListeKenne();
anbieten zu können?
 

Mark3108

Mitglied
@Marco13

ja genau "einElement.löscheDichAusDerListeInDerDuBistOhneDassIchDieInstanzDieserListeKenne();" triffts genau.

@Andi_CH

Diese Ringpuffer Lösungen funktionieren anders. Da ist es so wie ich das sehe auch nicht möglich Elemente aus der Liste zu löschen ohne diese zu kennen.

Das letze Element zeigt aufs erste war falsch ausgedrückt merke ich eben. Das letzte Element zeigt in meinem Ansatz auf die Liste selbst. Was ich also bräuchte wäre ein cast von TExtendedListItem extends TListItem nach TList extends TListItem. Die zwei Typen sind nicht kompatibel. Deshalb gibts ne Exception wenn ich dem next des letzten objekts die liste zuweisen will.

Frage mich jetzt ob mein Ansatz einfach falsch ist und man sowas anders machen würde.
 

Mark3108

Mitglied
Habs jetzt hinbekommen. Parametrisier das ganze jetzt anders und dann gehts. Dachte ich kann mir diese "unnötigen" cast überall sparen. Das klappt wohl nicht. Hab jetzt noch einen drin aber gut.

Danke für eure Hilfe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
O ADT Liste z. B. Java Basics - Anfänger-Themen 15
B sortierte Liste Java Basics - Anfänger-Themen 4
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
Queiser Liste zurückgeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
S spezielle Wörter aus Liste entfernen Java Basics - Anfänger-Themen 2
H Verkettete Liste Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben