Methoden Verkettete Listen Index eines Elementes ausgeben

vaults

Mitglied
Moin Leute,

ich bin grade dabei einige Methoden für eine verkettete Liste zu schreiben, zwei fehlen noch und bei diesen komme ich nicht weiter.

Ich implementiere bei meiner Klasse LinkedList das Interface List.
Die Struktur ist so, das jedes Objet aus zwei Teilen besteht, einmal das Itemfeld
Java:
private Object item;
mit dem eigentlichen Inhalt, sowie ein Zeigerfeld
Java:
private LinkedList next;
welcher auf dieses verweist. Das erste Zeigerfeld ist null.

Ich kann nun nach belieben Objekte hinzufügen, an bestimmte Positionen schreiben, löschen, hinten anhängen usw, zb. mit:

Java:
LinkedList l1 = new LinkedList();
l1.insert("FF");
l1.insert(4.7);
l1.insert(567);
l1.insert("moin");

und erhalte dann mit der toString:
Java:
--> 4.7 --> loblibuh --> FF --> jo was geht --> 15 --> moin --> 4a --> moin --> 567 --> 4.7 --> FF |--
diese Ausgabe. (hatte noch mehr drinne)

Grundsätzlich laufen alle Methode rekursiv ab, von vorne beginnend wird geprüft und ggf. mittels
Java:
return next.methode()
das ganze erneut für das folgende Element aufgerufen.

Ich soll jetzt zwei Methoden schreiben, die mir jeweils den ersten Index, sowie den letzten Index des übergebenen Elementes ermitteln.
Java:
int firstIndexOf(Object x);
int lastIndexOf(Object x);

Da die Funktionen rekursiv für jedes Element der Liste laufen, kann ich keine lokalen Variablen anlegen, globale ergeben auch keinen Sinn, da diese dann das Ergebnis bei mehrmaligem Aufruf der Funktion verfälschen würden.

Mittels length() kann ich die Länge der verbleibenden Liste abfragen, diese ändert sich dann natürlich mit jedem Aufruf, da ich jeweils ein Element weitergehe.

Mir ist nicht klar, wie ich dies realisieren soll, hier ein Ansatz der aber nichts vernünftiges liefert.
Java:
public int firstIndexOf(Object x){
		
			if (isEmpty()){
				return -1;
			}
			
			else{
				while (!(next.getItem().equals(x))){
					return next.firstIndexOf(x);			
			}
			System.out.println(length());
			return this.length();
		}
	}
Vielleicht hat sich ja jemand auf dieses Gebiet spezialisiert und kann mir helfen.

Über Tipps würde ich mich sehr freuen.

LG,
Alex
 
S

SlaterB

Gast
du kannst Parameter an den nächsten Aufruf übergeben, oder mit dem Rückgabewert arbeiten, was du halb schon versuchst

z.B. könnte bei firstIndexOf() die Methode bei Fund 1 zurückgeben, der vorherige rekursive Aufrufer schaut sich den Rückgabewert an,
wenn 0 dann bei 0 belassen, nix gefunden, wenn > 0, dann um 1 erhöhen, so kommt ganz am Anfang 5 zurück, wenn es 5 war,
mit length() zu arbeiten hilft natürlich auch irgendwann irgendwie, wie arbeitet die Methode eigentlich?
 

vaults

Mitglied
Moin,

das klingt sehr vielversprechend, werde es heute Nacht mal ausprobieren und mich dann wieder melden.

Danke schonmal und noch ein schönes WE.

LG,
Alex
 

Fant

Bekanntes Mitglied
Bloß keine Rekursion! (oder sollst du das so machen?)

Stell dir mal vor, was dann passiert, wenn du 100.000 Einträge in deiner Liste hast, oder mehr...

Du musst doch einfach nur linear deine Liste durchsuchen und dabei hochzählen. Wenn du dein gesuchtes Element findest, dann gibst du den aktuellen Zählerstand aus, wenn nicht, dann einfach -1.
 

vaults

Mitglied
Ich sehen keinen anderen Weg als bei einer verketteten Liste das ganze rekursiv durchzugehen und bei jeder Rekursion den Zeiger auf das Folgeelement zu legen.

Globale Variablen machen meiner Meinung nach keinen Sinn.
Ich kann diese benutzen wenn ich die Methode nur ein einziges mal aufrufe, da sonst bei erneutem Aufruf der Startwert der globalen Variable anders ist.

Auch kann ich diese in der Funktion weder vor dem Return zurück auf 0 setzen, noch zu Beginn der Methode, da sonst bei jeder Rekursion der Wert ebenfalls wieder auf 0 zurückgesetzt würde.
 

vaults

Mitglied
Moin,

so habe den Ansatz von SlaterB genommen und habe nun eine "eigentlich" funktionstüchtige Funktion, die zum Großteil den korrekten Wert ausgibt:

Java:
// Liefert ersten Index des übergebenen Elementes												//Verbleibend
	public int firstIndexOf(Object x){
		
		while (!isEmpty()){
			if (this.item == x){
				System.out.println(this.item == x);
				System.out.println(this.item.equals(x));
				break;
			}
			else {
				return 1+next.firstIndexOf(x);
			}
		}
		return 0;
	}

Der Aufruf:
Java:
System.out.println(l1.firstIndexOf("jo was geht"));
liefert das korrekte Ergebnis:
Code:
 --> 4.7 --> loblibuh --> FF --> jo was geht --> 15 --> moin --> 4a --> moin --> 567 --> 4.7 --> FF |--
true
true
4

Die Werte "loblibuh", sowie 4.7 und 567 liefert komischerweise einen Fehler.
loblibuh ist vom Typ Element und kann somit nicht einfach mit "==" abgefragt werden, 4.7 ist das erste Element, vielleicht hackts da, 567 sollte er aber eingentlich machen, denn auch bei 15 liefert er das korrekte Ergebnis.

Das eigentlich komische an der Sache ist allerdings, dass wenn ich die Abfrage auf :
Java:
if (this.item.equals(x)){         // oder (this.getItem().equals(x)
umstelle, bekomme ich bei jedem Aufruf einen Fehler? Das verstehe ich nicht, vielleicht kann mir hier jemand helfen.

LG,
Alex
 

vaults

Mitglied
Die Funktion funktioniert jetzt für alle Objekte, außer für Objekte der Klasse Elemente.
Die implementiert allerdings comparable, weiß also nicht woran das liegt.

Java:
// Liefert ersten Index des übergebenen Elementes												//Verbleibend
	public int firstIndexOf(Object x){
		if (this.equals(null)){
			return next.firstIndexOf(x);
		}
		while (!isEmpty()){
			if (next.getItem().equals(x)){
				return 1;
			}
			else {
				return 1+next.firstIndexOf(x);
			}
		}
		return 0;
	}
 
S

SlaterB

Gast
equals null ist immer Quatsch, wenn dann ==,
und das eigene Objekt, this, kann nicht null sein,

wenn du eine Schleife garantiert im ersten Durchlauf beendest, dann ist es keine Schleife, schreibe if statt while

auf den Nachfolger ungeprüft 1 zu addieren berücksichtigt nicht, dass ein Objekt nicht gefunden wird/ nicht vorhanden ist,
den Fall musst du auch testen, was soll dann zurückgegeben werden?

wie gesagt wurde besser mit Index 0 als validen Index anfangen, nicht 1

----

um zu wissen was mit Elemente los ist braucht es mehr Code, z.B. die Information ob du genau ein vorhandenes Objekt suchst
oder eins mit gleichen Inhalt,
zu vermuten ist, dass equals() nicht passend überschrieben ist
 

Fant

Bekanntes Mitglied
Ich sehen keinen anderen Weg als bei einer verketteten Liste das ganze rekursiv durchzugehen und bei jeder Rekursion den Zeiger auf das Folgeelement zu legen.

Wie man es macht hab ich dir doch gerade schon skizziert. Hier rekursiv zu arbeiten bricht dir wirklich viel schneller das Genick, als du gucken kannst...


Schau dir doch zum Vergleich einfach mal die entsprechenden Methoden aus java.util.LinkedList an. Die sollte man mit wenig Aufwand an deine Implementierung anpassen können.

Java:
  580       // Search Operations
  581   
  582       /**
  583        * Returns the index of the first occurrence of the specified element
  584        * in this list, or -1 if this list does not contain the element.
  585        * More formally, returns the lowest index {@code i} such that
  586        * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
  587        * or -1 if there is no such index.
  588        *
  589        * @param o element to search for
  590        * @return the index of the first occurrence of the specified element in
  591        *         this list, or -1 if this list does not contain the element
  592        */
  593       public int indexOf(Object o) {
  594           int index = 0;
  595           if (o == null) {
  596               for (Node<E> x = first; x != null; x = x.next) {
  597                   if (x.item == null)
  598                       return index;
  599                   index++;
  600               }
  601           } else {
  602               for (Node<E> x = first; x != null; x = x.next) {
  603                   if (o.equals(x.item))
  604                       return index;
  605                   index++;
  606               }
  607           }
  608           return -1;
  609       }
  610   
  611       /**
  612        * Returns the index of the last occurrence of the specified element
  613        * in this list, or -1 if this list does not contain the element.
  614        * More formally, returns the highest index {@code i} such that
  615        * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
  616        * or -1 if there is no such index.
  617        *
  618        * @param o element to search for
  619        * @return the index of the last occurrence of the specified element in
  620        *         this list, or -1 if this list does not contain the element
  621        */
  622       public int lastIndexOf(Object o) {
  623           int index = size;
  624           if (o == null) {
  625               for (Node<E> x = last; x != null; x = x.prev) {
  626                   index--;
  627                   if (x.item == null)
  628                       return index;
  629               }
  630           } else {
  631               for (Node<E> x = last; x != null; x = x.prev) {
  632                   index--;
  633                   if (o.equals(x.item))
  634                       return index;
  635               }
  636           }
  637           return -1;
  638       }
 

vaults

Mitglied
Moin,

danke, die Methode wurde erstmal so angepasst, dass er prüft ob das Element vorhanden ist, auch die Abfrage ob this == null ist, wurde gelöscht, er prüft dies bereits in der "isEmpty()" Funktion.

In diesem Fall ist das erste Objekt null, es markiert den Anfang der Liste.

Java:
// Liefert ersten Index des übergebenen Elementes												//Verbleibend         FAST FERTIG
	public int firstIndexOf(Object x){
		if (!isInList(x)) return -1;
		while (!isEmpty()){
			if (next.getItem().equals(x)){
				return 1;
			}
			else {
				return 1+next.firstIndexOf(x);
			}
		}
		return 0;
	}

LG,
Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
N verkettete Listen Java Basics - Anfänger-Themen 4
M verkettete Listen Java Basics - Anfänger-Themen 1
D Collections Verkettete Listen und Fußball... Java Basics - Anfänger-Themen 11
S Verkettete Listen Java Basics - Anfänger-Themen 10
S Verkettete Listen in Java Java Basics - Anfänger-Themen 11
C Methoden Verkettete listen - next methode Java Basics - Anfänger-Themen 3
I verkettete listen Java Basics - Anfänger-Themen 12
K verkettete Listen - Klasse Knoten Java Basics - Anfänger-Themen 19
U Verkettete Listen Java Basics - Anfänger-Themen 13
M Probleme mit verkettete Listen Java Basics - Anfänger-Themen 4
M verkettete Listen Java Basics - Anfänger-Themen 39
T Klasse in Java für doppelt verkettete Listen Java Basics - Anfänger-Themen 4
I verkettete listen Java Basics - Anfänger-Themen 5
H Doppelt verkettete Listen Java Basics - Anfänger-Themen 2
S doppelt verkettete Listen Java Basics - Anfänger-Themen 4
X Vererbung: Doppelt verkettete Listen Java Basics - Anfänger-Themen 16
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
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
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
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2
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
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
H Verkettete Liste Java Basics - Anfänger-Themen 7
N Verkettete liste rückwärts ausgeben Java Basics - Anfänger-Themen 18
K Verkettete Liste und seine Methoden Java Basics - Anfänger-Themen 1
N Verkettete Liste implementieren Java Basics - Anfänger-Themen 5
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
B Doppelt Verkettete Liste - Ist alles gut so? Java Basics - Anfänger-Themen 3
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
L Doppelt verkettete Liste Java Basics - Anfänger-Themen 6
J Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger Java Basics - Anfänger-Themen 8
V Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 3
R doppelt verkettete Liste aus Arrays erstellen Java Basics - Anfänger-Themen 1
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
G 2 Aufgabe rund um eine verkettete Liste Java Basics - Anfänger-Themen 2
O Verkettete Liste Java Basics - Anfänger-Themen 10
E Methoden auf von Methoden erstellte Objekte zugreifen (verkettete Liste) Java Basics - Anfänger-Themen 10
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
S Doppelt verkettete Liste Java Basics - Anfänger-Themen 3
G Doppelt Verkettete Liste Java Basics - Anfänger-Themen 2
A Doppelt Verkettete Liste Java Basics - Anfänger-Themen 16
E doppelt verkettete liste Java Basics - Anfänger-Themen 10
V Verkettete Liste. Java Basics - Anfänger-Themen 7
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Verkettete Liste - Methode entwerfen Java Basics - Anfänger-Themen 14
S Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 12
B Insertionsort verkettete Liste Java Basics - Anfänger-Themen 4
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
R verkettete liste ansEndeSchieben Java Basics - Anfänger-Themen 13
T Verkettete Liste Java Basics - Anfänger-Themen 14
A Klassen Innere Klassen, verkettete Liste Java Basics - Anfänger-Themen 9
B Zweifach-verkettete Liste umkehren Java Basics - Anfänger-Themen 6
X verkettete Liste Java Basics - Anfänger-Themen 13
E Datentypen Doppelt verkettete Liste Java Basics - Anfänger-Themen 10
P Einfügen in doppelt verkettete Liste Java Basics - Anfänger-Themen 7
kae verkettete Liste Java Basics - Anfänger-Themen 5
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
B OOP Verkettete Liste Java Basics - Anfänger-Themen 7
R verkettete liste Java Basics - Anfänger-Themen 5
M Verkettete Liste Java Basics - Anfänger-Themen 4
M verkettete liste Java Basics - Anfänger-Themen 7
N doppelt verkettete liste einfügen Java Basics - Anfänger-Themen 7
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
G verkettete Liste - invertieren Java Basics - Anfänger-Themen 2
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
B verkettete Liste Java Basics - Anfänger-Themen 8
S zyklisch verkettete Liste erstellen Java Basics - Anfänger-Themen 3
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
W Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 2
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
J verkettete Liste Java Basics - Anfänger-Themen 2
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
DasDogma Verkettete Liste - Element löschen Java Basics - Anfänger-Themen 2
H Verkettete Liste Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben