Linked List mit Interface erstellen

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,
habe folgendes Problem: Soll für eine HA ein Abstrakten Datentyp selbst erstellen der eine verkettete Liste bearbeitet.
Um dies zu machen wurde mir ein Interface zur verfügung gestellt. In diesem ist neben den Mehoden noch eine Unterklasse namens Node. Diese Unterklasse soll in die meine Hauptklasse LinkedList eingebunden werden und sieht dann so aus:


Code:
	protected static class ListNode implements List.Node{
		public int data;	//die gespeicherte Ganzzahl
		public ListNode next;	//naechster Knoten der verketteten Liste
		public int getData() {return data;}
	}

Die Methoden sehen dann aber zb wie folgt aus (Auszug aus Interface):

public interface List {
    // Das Interface fuer Listeneintraege.  Da die Listenstruktur von aussen
    // nicht veraendert werden soll, exponieren wir nur dieses Interface.
    public interface Node {
        public int getData();
    }

    // Erstellt einen neuen Listeneintrag fuer das Element a und fuegt
    // ihn am Kopf der Liste hinzu.
    public void add(int a);

    // Erstellt einen neuen Listenknoten f"ur und f"ugt ihn nach n in der Liste
    // ein.
    public void insert(Node n, int a);

    // Findet das erste Vorkommen einer Node in der Liste und gibt eine
    // Referenz auf den jeweiligen Listeneintrag zurueck (oder null,
    // wenn es nicht enthalten ist).
    public Node find(int a);

    // Findet das erste Vorkommen eines Werts und entfernt den
    // entsprechenden Listeneintrag aus der Liste.
    public void remove(int a);

    // Entfernt den Listeneintrag aus der Liste.
    public void remove(Node e);

    // Gibt den ersten Eintrag der Liste zurueck.
    public Node getFirst();

    // Gibt den Listeneintrag zurueck, der Nachfolger von e ist.
    public Node getNext(Node e);

Nun zu meiner Frage. Ich versteh nicht ganz wie ich in meiner Klasse namens LinkedList mit der oben gezeigten protected Klasse die Methoden bearbeiten muss, welche als Ein- oder Ausgabe ein Objekt von dem Typ Node brauchen, da es diesen Typ ja in der Klasse gar nicht gibt. Casten funktioniert zwar aber ist glaub ich nicht grad die richtige Lösung, da ich zb in der main- Methode die insert- Funktion damit ja nicht richtig ausführen kann.

Im Anhang noch mein Code, den ich bis jetzt geschafft hab. Habe jetzt schon mind. 5 Std damit verbracht und bin nicht gerade weit gekommen. Also bitte melden! DANKE!
Code:
//import List.Node;


public class LinkedList implements List{
	LinkedList.ListNode kopf;
	LinkedList.ListNode pos;

	boolean first = true;


	protected static class ListNode implements List.Node{
		public int data;	//die gespeicherte Ganzzahl
		public ListNode next;	//naechster Knoten der verketteten Liste
		public int getData() {return data;}
	}

    public LinkedList( ) {
        kopf = pos = new ListNode();
        kopf.next = null;
    }

    public void add(int a)
    {
    		ListNode element = new ListNode();
    		element.data = a;
    		if(first == true)
    		{
    			element.next = kopf;
    			first = false;
    		}
    		element.next = pos.next;
    		pos.next = element;
    }

    public void insert(Node n, int a)
    {
    	if(n != null)
    	{
    		ListNode element = new ListNode();
    		element.data = a;
    		element.next = (ListNode) n;
    	}
    }

    public Node find(int a)
    {
    	ListNode beginn = pos;
    	do
    	{
    		if(beginn.data == a)
    			return beginn;
    		else
    			beginn = beginn.next;
    	}while(beginn.next != null);
    	return null;
    }

    public void remove(int a)
    {

    }

    public void remove(Node e)
    {

    }

    public Node getFirst()
    {
		return null;

    }

    public Node getNext(Node e)
    {

    }

    public Node getLast()
    {

    }

    public Node getPrevious(Node e)
    {

    }

    public int size()
    {
    	int zaehler = 0;
    	ListNode beginn = pos;
    	while(beginn.next != null)
    	{
    		beginn = beginn.next;
    		zaehler++;
    	}
    	return zaehler;
    }

    public String toString()
    {
    	String str="";
    	str = str + kopf.data;
    	return str;
    }

	public static void main(String[] args) {
		LinkedList list1 = new LinkedList();

		Node n = new ListNode();

		list1.add(5);
		list1.add(3);
		list1.add(4);

		list1.insert(n, 8);
		//System.out.println(list1.toString());
		System.out.println(list1.size());
		System.out.println(list1.find(3));
	}

}
:cry:
 
S

SlaterB

Gast
hm, da hast du ein ernstes Problem, zu dem ich auch keine fertige Lösung sehe,

wenn Node ein Teil deiner Listenstruktur ist, dann darf der Node nicht von außen unbekannt vorgegeben werden,
ist die Klasse ListNode von dir oder auch vorgegeben?

gäbe es die nicht, dann wäre es denkbar (obwohl der Kommentar im Interface wiederum eher dagegen spricht),
dass Node ein reines Datenelement ist, deine Liste also wie folgt aussieht:

Code:
List

Entry  -> Entry -> Entry -> ..
   |         |
   v         v
  Node      Node
   |         |
   v         v
  int       int

---------

edit:
andererseits soll ja gar kein Node von außen direkt eingefügt werden, die übergebenen Nodes dienen nur zum Vergleich,
// Erstellt einen neuen Listenknoten f"ur und f"ugt ihn nach n in der Liste
// ein.
public void insert(Node n, int a);

dann brauchst du nur auf == prüfen, wenn irgendjemand einen Node einer anderen Klasse übergibt, oder einen Node, der nicht in der Liste ist,
dann hat der Aufrufer eben Pech gehabt,

du musst die übergebenen Nodes nicht auf ListNode casten,
das Feststellen einer anderen Klasse (instanceof) würde dir aber die Möglichkeit geben, bei falschen Nodes die Bearbeitung gleich abzubrechen
 
G

Gast

Gast
Danke für deine Antwort erst mal. Die Klasse ListNode ist so schon vorgegeben.
Bin jetzt auch schon bisschen weiter gekommen aber muss trotzdem immer Cast verwenden.
Wenn ich z.B. die Insert Methode verwende, sieht das jetzt so aus:

In der Main:
Code:
list1.insert(list1.find(3), 8);

Die Methode selbst:
Code:
    public void insert(Node n, int a)
    {
    	ListNode zeiger = (ListNode) n;
    	if(n != null)
    	{
    		ListNode element = new ListNode();
    		element.data = a;
    		element.next = zeiger.next;
    		zeiger.next = element;

    	}
    }


Die Methode find:
Code:
    public Node find(int a)
    {
    	ListNode beginn = kopf;
    	do
    	{
    		if(beginn.data == a)
    			return beginn;
    		else
    			beginn = beginn.next;
    	}while(beginn.next != null);
    	return null;
    }

Also ist es jetzt so, dass ich ein Objekt vom Typ ListNode in den Typen Node zurückgeben kann ohne ein Cast zu verwenden (wie in Methode find()) aber wenn ich ein Node als ListNode verwenden möchte, muss ich es erst casten (wie in der insert() Methode). Warum das so ist versteh ich ehrlich gesagt nicht ganz.
 
S

SlaterB

Gast
die Operation insert funktioniert zwar bisher so wie sie ist,
aber wenn der Node aus einer anderen Liste stammt, dann wird in diese etwas eingefügt, ob das so sauber ist?

und wenn wie gesagt kein ListNode übergeben wird, dann gibt es eine Exception beim Cast,

ganz ohne Problem bist du bei

public void insert(Node n, int a)
{
// Check auf n == null am Anfang, evtl. noch Check auf instanceof ListNode
// eigene Liste durchgehen mit == vergleichen
// nur wenn Knoten gefunden, dann mit eigenen Knoten weiterarbeiten

}

----------

> Warum das so ist versteh ich ehrlich gesagt nicht ganz

ein Mercedes ist immer ein Auto, wenn man ein Auto braucht kann man bedenkenlos auch ein Mercedes-Objekt übergeben,

andersrum ist schlecht,
ein beliebiges Auto ist ja nicht unbedingt ein Mercedes, ein beliebiges Auto kann man zunächst nicht als Mercedes behandeln,
es könnte aber ein Mercedes sein,
wenn man sich sicher ist, dann kann man das dem Programm mitteilen: dieses Auto ist ein Mercedes == Casten
(wenn es nicht stimmt: ClassCastException)
 
G

Gast

Gast
ok, ich glaube jetzt hab ichs. Stimmt es dann, dass mir das Interface vorgibt, das es eine Klasse names Node geben muss und ich in meiner Hauptklasse sag, das die protected Klasse ListNode eine Unterklasse der Klasse Node ist?

Die Insert() sieht jetzt so aus. Könntest ja nochmal einen Blick drauf werfen ob du das so ungefähr gemeint hast. Danke!

Code:
    public void insert(Node n, int a)
    {
    	if(n == null || (n instanceof ListNode)==false)
    	{
    		System.out.println("Der Knoten konnte nicht gefunden werden oder ist keine ListNode.");
    	}
    	else
    	{
    		ListNode beginn = kopf;
    		while(beginn.next != null)
    		{
    			if(beginn == n)
    			{
    	        	ListNode zeiger = (ListNode) n;
    	    		ListNode element = new ListNode();
    	    		element.data = a;
    	    		element.next = zeiger.next;
    	    		zeiger.next = element;
    	    		return;
    			}else
    				beginn = beginn.next;
    		}
    	}
    }
 
G

Gast

Gast
ok, in der letzten else muss noch ne abfrage ob beginn == null und falls ja, dann gibt es diesen knoten in dieser liste nicht. Oder?
 
G

Gast

Gast
Muss doch anders aussehen. Die Aussage, das dieser Eintrag in der Liste nicht vorhanden ist kommt nicht in die else abfrage, sondern einfach nach der while-schleife...
 
S

SlaterB

Gast
> Stimmt es dann, dass mir das Interface vorgibt, das es eine Klasse names Node geben muss

ne, das Interface gibt vor, dass es die Klasse Node gibt! (genauer: das Interface Node),
wenn es die ncht gäbe könnte es das Interface nicht benutzen,

ob es irgendwelche Klassen gibt, die Node implementieren, weiß keines der Interface,
aber ohne die Klassen kann man die Operationen eh nicht aufrufen

--------

gibts bei insert noch Fragen nach den vielen Postings?

Code:
if(beginn == n) 
             { 
                  ListNode zeiger = (ListNode) n;
du brauchst weder die neue Variable zeiger noch musst du n casten,
beginn ist doch == n, arbeite also mit beginn

beginn ist übrigens ein eher schlechter Name,
vielleicht lieber laufNode oder nodeInList
 
G

Gast

Gast
Hast recht, der zusätzliche zeiger war echt quatsch. hab jetzt nur den
pointer vom Anfang noch umbenannt in NodeInList und läuft alles gut so.
Nur nochmal kurz zur Verständniss von dieser Klasse Node.
Wie ich davor schon gepostet hab ist dann ListNode eine Unterklasse von Node oder?
Und casten muss ich dann nicht, weil ListNode ja vom typ Node ist. (also wie auch Mercedes vom typ Auto ist).

Und das schwierigste für mich zuletzt:
Die Klasse Node ist in meiner LinkedList- Klasse bekannt, weil ich die protected class ListNode implements List.Node hab? oder wieso kennt er die?
 
S

SlaterB

Gast
> ListNode eine Unterklasse von Node

ja

> Und casten muss ich dann nicht, weil ListNode ja vom typ Node ist.

ListNode ln = null;
Node n = null;

n = ln; // kein casten
ln = (ListNode) n; // casten, bei Pech ist es ein anderer Node

> wieso kennt er die?

weil sie im Interface List definiert ist und entweder dieses Interface List im gleichen package liegt
oder du irgendwo
import List.Node;
stehen hast
 
G

Gast

Gast
Aha, ok.
Node liegt dann im gleichen package wie die List und wird daher erkannt. Großen Dank für deine Hilfe, denke ich komm dann alleine klar.
Werd mich bei gelegenheit hier auch mal anmelden, scheint ein gutes
forum zu sein ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Linked List set-Methode Java Basics - Anfänger-Themen 2
G Linked list, Methode zum Vertauschen von Elementen Java Basics - Anfänger-Themen 14
T KlausurÜbung- Förderband-Linked List Java Basics - Anfänger-Themen 53
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
L Linked List - Array List Java Basics - Anfänger-Themen 2
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
G Linked List Programm add Problem Java Basics - Anfänger-Themen 5
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
E Linked List generisch Java Basics - Anfänger-Themen 5
H Linked List sortieren Java Basics - Anfänger-Themen 9
B Linked-List Java Basics - Anfänger-Themen 2
T einfügen bei einer Linked List Java Basics - Anfänger-Themen 8
J linked list add ? Java Basics - Anfänger-Themen 2
J linked list Java Basics - Anfänger-Themen 13
M Beispiel für Linked List Java Basics - Anfänger-Themen 9
N Linked list sortieren Java Basics - Anfänger-Themen 8
K Java Linked List Java Basics - Anfänger-Themen 11
W löschen in einer single linked list Java Basics - Anfänger-Themen 3
M Linked List schreiben und lesen Java Basics - Anfänger-Themen 4
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
G (Linked)HashMap sortieren Java Basics - Anfänger-Themen 1
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
B Vektor vs List Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Datentypen Array List Java Basics - Anfänger-Themen 9
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
W Stream Array List - Frage Java Basics - Anfänger-Themen 5
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
M List<String> auswählen Java Basics - Anfänger-Themen 42
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
B Sorting List und Remove Java Basics - Anfänger-Themen 2
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
M Methode überladen - Array List Java Basics - Anfänger-Themen 5
L LIST.ADD Java Basics - Anfänger-Themen 2
M XWPF - Bullet Point list erstellen Java Basics - Anfänger-Themen 1
I <List> sortieren Java Basics - Anfänger-Themen 2
N Klassen List-Art Java Basics - Anfänger-Themen 5
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
F .csv Export aus einer list Java Basics - Anfänger-Themen 25
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
T List und ArrayList Java Basics - Anfänger-Themen 3
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
D Input/Output CSV Parser list unvollständig Java Basics - Anfänger-Themen 25
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
U JAXB - List wird nicht ausgefüllt Java Basics - Anfänger-Themen 1
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Bestimmten Wert aus Array List ausgeben Java Basics - Anfänger-Themen 7
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
M List befüllen Java Basics - Anfänger-Themen 3
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
A Wie nutze ich List<List<String>> Java Basics - Anfänger-Themen 4
M Endlos schleife in List Java Basics - Anfänger-Themen 5
P Zufallszahlen ohne zahlen einer List Java Basics - Anfänger-Themen 21
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
T Tabstopp in AWT-List? Java Basics - Anfänger-Themen 8
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
A List mit integern füllen Java Basics - Anfänger-Themen 4
D sortieren von List<> Java Basics - Anfänger-Themen 2
B List - Drag&Drop Java Basics - Anfänger-Themen 8
C List Abfragenproblem Java Basics - Anfänger-Themen 3
J List als anonyme Klasse Java Basics - Anfänger-Themen 9
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
T Collections Wie funktioniert List() ? Java Basics - Anfänger-Themen 7
Kenan89 Java Date List Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
K Frage Set List Java Basics - Anfänger-Themen 3
M Array List ausgeben Java Basics - Anfänger-Themen 13
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
S Gute List Implementation Java Basics - Anfänger-Themen 5
A List Array - wie instanzieren Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben