Heterogene Datenstruktur Problem mit Set

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
Hi!

Ich hab in meinen VO-Unterlagen folgendes Codestück gefunden:
es geht um heterogene Bausteine;
Set kann aber unmöglich vollständig sein oder?

das PRoblem liegt glaub ich in der for-Schleife! das p!=null .... p ist aber null weil vorher p=data


Bekomm nämlich ne NullPointerException! :bloed:

Kann sich das bitte mal jemand anguggen?


Code:
public class Node {
	
	public Node next;
	public Comparable obj;
	
	public Node(Object x){
		obj=(Comparable) x;
	}

}

Code:
public class Set {
	
	Node data=null;
	
	
	public void include(Object obj){
		for(Node p=data;p!=null;p=p.next){
			if(p.obj.compareTo(obj)==0)return;
			
			p=new Node(obj);
			p.next=data; data=p;
		}
	}
}

Code:
	public static void main(String  [] args){
		
		Set set=new Set();
		set.include("Anton");
		set.include("Hans");
		set.include("Franz");

Danke!
 
B

Beni

Gast
Ich kriege keine NullPointerException. Und das Codestück das du gepostet hast, kann auch niemals eine NullPointer erzeugen (schliesslich wird die Schleifenbedingung niemals erfüllt, daher die Schleife niemals ausgeführt). *sehr verdächtig*

Also bitte, abgesehen von dem unnötigen Comparable (equals wäre hier angebracht), und der arg seltsamen Schleifenlogik (ein neuer Knoten muss nach der Schleife hergestellt werden, nicht in der Schleife drin), sehe ich keine Probleme.
 

Sindbad1983

Top Contributor
naja..das Codestück ist wie gsagt eh nicht von mir ! :wink:

ICh versuch es nur lauffähig zu machen!

ICh glaub so falsch ist es nicht was ich bis jetzt hab, aber die for-Schleife check ich überhaupt nicht!
Hab shcon viel probiert, aber nichts stimmt!
Kannst du mir da bitte helfen!
Ich glaub das kommt zur Klausur :###

Ich hab auch zusätzlich einen Iterator implementiert, der dürfte aber auch nicht richtig hinhaun! :cry:

Code:
public class Set {
	
	
	Node head;
	Node tail;
	Node p;
	
	
	public Set(){
		head=null;
		tail=null;
	}
	
	public void include(Object obj){
		
		
		if(head==null){
			p=new Node(obj);
			head=p;
			tail=head;
			System.out.println("Head einfügen");
			
		}
		
		else{
			//System.out.println("else-Teil betreten");
		         for(tail=p;tail.next!=null;tail=tail.next){ //FALSCH!!!
			          System.out.println("Es soll vergleicht werden:");
			               if(p.obj.compareTo(obj)==0){
				              System.out.println("vergleichen");
				              return;
			               }
		          }
			
			p=new Node(obj);
			tail.next=p; tail=p;
			System.out.println("Neuer Knoten eingefügt");
			
		
		}
	}
	
	public SetIterator iterator(){
		return new SetIterator(){
			
			
			public boolean hasNext(){
				if(p.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				return p.next;
				
			}
			
		};
	}
	
	
	
	

}

Code:
public class Node {
	
	public Node next;
	public Comparable obj;
	
	public Node(Object x){
		obj=(Comparable) x;
	}

}

Code:
public interface SetIterator {
	
	public boolean hasNext();
	public Object next();

}

Code:
public class SetTest {
	
	public static void main(String  [] args){
		
		System.out.println("aaa");
		
		Set set=new Set();
		set.include("Anton");
		set.include("Hans");
		set.include("Thomas");
		set.include("Franz");
		set.include("Roland");
		set.include("Anton");
		set.include("Anton");
		
		System.out.println("bbb");
		
		for(SetIterator it=set.iterator();it.hasNext();){
			Node p=(Node) it.next();
			System.out.println("ccc");
			System.out.println(p);
			System.out.println("ddd");
		}
		
	
		
	}
}



Head einfügen
else-Teil betreten
Neuer Knoten eingefügt
else-Teil betreten
Neuer Knoten eingefügt
else-Teil betreten
Neuer Knoten eingefügt
else-Teil betreten
Neuer Knoten eingefügt
else-Teil betreten
Neuer Knoten eingefügt
else-Teil betreten
Neuer Knoten eingefügt
bbb
 

byte

Top Contributor
hab mal kurz drübergeguckt. einfach verkettete liste... der fehler liegt imo in der klasse set:

Code:
public class Set {
	
	Node data=null;
	
	
	public void include(Object obj){
		for(Node p=data;p!=null;p=p.next){
			if(p.obj.compareTo(obj)==0)return;
		}	// hier muss die klammer zu!
			p=new Node(obj);
			p.next=data; data=p;
		//}
	}
}

die for-schleife muss direkt nach der if-bedingung zugehen. die schleife prüft, ob das objekt schon als knoten existiert. wenn ja, wird die methode durch das return verlassen, ohne dass obj eingefügt wird. falls nein, wird obj als neuer knoten am anfang der liste eingefügt, also als neuer Knoten data.

ps: solche kleinen fehler tauchen irgendwie häufiger in vorlesungsskripten auf - warum nur? ;)

//edit: beziehe mich auf den ursprünglichen code aus dem ersten post!
 

Sindbad1983

Top Contributor
danke Byto!

Ich hab aber jetzt noch ein bissl herumprobiert, und das ganze ein wenig erweitert!
Jetzt funktionierts! :lol:

nur was mit dem Iterator ist, weiß ich noch immer nicht! Eigentlich müsst er so schon gehen.. oder nicht?


Code:
public class Set {
	
	
	Node head;
	Node tail;
	Node p;
	
	
	public Set(){
		head=null;
		tail=null;
	}
	
	public void include(Object obj){
		
		
		if(head==null){
			p=new Node(obj);
			head=p;
			tail=head;
			System.out.println("Head einfügen");
			
		}
		
		else{
			
		         for(tail=head;tail.next!=null;tail=tail.next){ //FALSCH!!!
		        	// System.out.println("for-Schleife betreten");
			          //System.out.println("Es soll verglichen werden:");
			               if(tail.obj.compareTo(obj)==0){
				          //    System.out.println("vergleichen");
				              return;
			               }
		          }
			
			p=new Node(obj);
			tail.next=p; tail=p;
			System.out.println("Neuer Knoten eingefügt");
			
		
		}
	}
	
	public SetIterator iterator(){
		return new SetIterator(){
			int index=0;
			
			public boolean hasNext(){
				if(p.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				return p.next;
				
			}
			
		};
	}
	
	
	
	

}
 

Sindbad1983

Top Contributor
was stimmt denn mit meinem Iterator nicht?

Kann sich das vielleicht noch jemand anguggen bitte?



in der main-Methode hab ich dann folgendes:

Code:
SetIterator it=set.iterator();
	while(it.hasNext()){
		System.out.println((Node)it.next());
	}


und die Methode eben in Set:

Code:
	public SetIterator iterator(){
		return new SetIterator(){
			
			
			public boolean hasNext(){
				if(tail.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				return tail;
				
			}
			
		};
	}
 

byte

Top Contributor
ich seh auf die schnelle keinen fehler. poste halt mal die fehlermeldung und sag, was genau nicht funktioniert. du musst schon bissel mehr tun als c/p und zurücklehnen, wenn du willst, dass dir geholfen wird.
 

Bleiglanz

Gesperrter Benutzer
Sindbad1983 hat gesagt.:
kann mir bitte jemand sagen, was bei meinem Iterator nicht stimmt? bzw. wieso er nicht funktioniert?
Danke!
ist doch völlig im eimer?

wo bewegt sich denn der Zeiger vorwärts in der next() Methode???
 

Sindbad1983

Top Contributor
ich hab mich eh nicht zurückgelehnt! :wink:

HAb schon viel ausprobiert, aber es geht nicht!

Momentan macht er eine Endlosschleife! :bloed:

Ich weiß nicht, wie ich die next()-Methode implementieren soll!
Hier mal das ganze Beispiel, damit ihr auf dem laufenden Stand seid..aber es stimmt eh wie gesagt nur der Iterator nicht!
Ich möchte die gesamt Set mit dem Iterator durchlaufen und die Werte ausgeben!

Oder stimmt doch mit der hasNext was nicht? weil woher kommt dann die Endlosschleife?






Code:
public class Set {
	
	
	Node head;
	Node tail;
	Node p;
	
	
	public Set(){
		head=null;
		tail=null;
	}
	
	public void include(Object obj){
		
		
		if(head==null){
			p=new Node(obj);
			head=p;
			tail=head;
			System.out.println("Head einfügen");
			
		}
		
		else{
			
		         for(tail=head;tail.next!=null;tail=tail.next){ //FALSCH!!!
		        	// System.out.println("for-Schleife betreten");
			          //System.out.println("Es soll verglichen werden:");
			               if(tail.obj.compareTo(obj)==0){
				          //    System.out.println("vergleichen");
				              return;
			               }
		          }
			
			p=new Node(obj);
			tail.next=p; tail=p;
			System.out.println("Neuer Knoten eingefügt");
			
		
		}
	}
	
	public SetIterator iterator(){
		return new SetIterator(){
			
			
			public boolean hasNext(){
				if(tail.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				return tail;
				
			}
			
		};
	}
}

Code:
public class Node {
	
	public Node next;
	public Comparable obj;
	
	public Node(Object x){
		obj=(Comparable) x;
	}

}

Code:
public interface SetIterator {
	
	public boolean hasNext();
	public Object next();

}

Code:
public class SetTest {
	
	
	
	public static void main(String  [] args){
		
		System.out.println("aaa");
		
		Set set=new Set();
		set.include("Anton");
		set.include("Hans");
		set.include("Anton");
		set.include("Anton");
		
		
	SetIterator it=set.iterator();
	while(it.hasNext()){
		System.out.println((Node)it.next());
	}
	
	
/*
		for(SetIterator it=set.iterator();it.hasNext();){
			System.out.println("Iterator in Takt!");
		
			Node p=(Node) it.next();
			
			System.out.println(p);
			
		}*/
	
		
		
		System.out.println("bbb");	
	}
}
 

Bleiglanz

Gesperrter Benutzer
die next() methode MUSS einen Seiteneffekt haben und einen internen Zeige nach vorn bewegen

bei dir gibt doch hasNext() immer das gleiche zurück, weil sich durch den aufruf von next() nichts ändert, deshalb die endlosschleife
 

Sindbad1983

Top Contributor
also ich hab jetzt alles Mögliche ausprobiert und es kommt ungefähr hin:hab auch jetzt den Code ein bissl geändert
bzw. auch den Iterator komplett neu geschrieben!

Er durchläuft aber nur 4 von 5 Elementen:



Set set=new Set();
set.include("Anton");
set.include("Kurt");
set.include("Roland");
set.include("Thomas");
set.include("Hansi");

Ausgabe:
Head einfügen
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Iterator in Takt!!
hetero.Node@1f6a7b9
Iterator in Takt!!
hetero.Node@7d772e
Iterator in Takt!!
hetero.Node@11b86e7
Iterator in Takt!!
hetero.Node@35ce36
bbb

und den Knoten gibt er auch nicht richtig aus... :bahnhof:




Code:
public class Set {
	
	
	Node head;
	Node tail;
	Node p;

	
	
	public Set(){
		head=null;
		tail=null;
	}
	
	public void include(Object obj){
		
		
		if(head==null){
			p=new Node(obj);
			head=p;
			tail=head;
			
			
			System.out.println("Head einfügen");
			
		}
		
		else{
			
		         for(p=head;p!=null;p=p.next){
		        	// System.out.println("for-Schleife betreten");
			          //System.out.println("Es soll verglichen werden:");
			               if(p.obj.compareTo(obj)==0){
				          //    System.out.println("vergleichen");
				              return;
			               }
		          }
			
			p=new Node(obj);
			tail.next=p; tail=p;
			
			System.out.println("Neuer Knoten eingefügt");
			
		
		}
	}
	
	public SetIterator iterator(){
	
		p=head;
		
		
		return new SetIterator(){
			
			
			public boolean hasNext(){
				if(p.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				
				return p=p.next;
				
			}
			
		};
	}
}


Code:
	SetIterator it=set.iterator();
	
	while(it.hasNext()){
	System.out.println("Iterator in Takt!!");
		System.out.println((Node)it.next());
	}

Vielleicht kann mir da noch jemand den letzten Fehler sagen bitte..
 

Sindbad1983

Top Contributor
ok..das mit 4 durchlaufen bzw. anzeigen aus 5 in der Liste enthaltenen Elementen hab ich jetzt gelöst!


vielleicht ein bissl umständlich, aber es geht..
gibt es da noch eine andere Möglichkeit?


Code:
public boolean hasNext(){
				if(p.next==null){
					return false;
				}
				else{
					return true;
				}
				
			}

			public Object next() {
				
				if(cnt==0){
					cnt++;
					return p;
					
				}
				else{
				
				cnt++;
				return p=p.next;
				}
				
			}


Die Ausgabe passt allerdings noch immer nicht! Es sollen ja die Namen ausgegeben werden!
Das ist mir allerdings ein Rätsel, weil ich ja in der Schleife eh einen Typcast mache...

aaa
Head einfügen
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Neuer Knoten eingefügt
Iterator in Takt!!
hetero.Node@1f6a7b9
Iterator in Takt!!
hetero.Node@7d772e
Iterator in Takt!!
hetero.Node@11b86e7
Iterator in Takt!!
hetero.Node@35ce36
Iterator in Takt!!
hetero.Node@757aef
bbb
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H generische Bausteine, heterogene Datenstrukturen 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
FelixN Teilsummenproblem / welche Datenstruktur Java Basics - Anfänger-Themen 2
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
O Datenstruktur auf SET prüfen in O(n) Java Basics - Anfänger-Themen 32
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
F Beste Datenstruktur zum Speichern? Java Basics - Anfänger-Themen 1
I Spielbrett programmieren: Datenstruktur Java Basics - Anfänger-Themen 3
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
S Welche Datenstruktur ist die optimalste um Funktionen fuer bestimmte Wertebereiche abzurufen..? Java Basics - Anfänger-Themen 5
C Methoden Datenstruktur Liste Java Basics - Anfänger-Themen 3
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Datenstruktur gesucht Java Basics - Anfänger-Themen 3
Luk10 Geeignete Datenstruktur Java Basics - Anfänger-Themen 4
J Erzeugen einer Datenstruktur Java Basics - Anfänger-Themen 12
T Datenstruktur für Sortierung Java Basics - Anfänger-Themen 4
H mehrdimensionale Datenstruktur erfassen Java Basics - Anfänger-Themen 10
StupidAttack Gson, welche Datenstruktur? Java Basics - Anfänger-Themen 4
T Java-Datenstruktur: zuweisen von Strings auf Listen von Strings Java Basics - Anfänger-Themen 10
N Vektor mit eigener Datenstruktur sortieren Java Basics - Anfänger-Themen 20
D Welche Datenstruktur für welche Problemstellung? Java Basics - Anfänger-Themen 10
A begrenzte Datenstruktur zur Speicherung von bytes Java Basics - Anfänger-Themen 6
H Adjazenzliste - Datenstruktur aber wie? Java Basics - Anfänger-Themen 7
Povlsen84 Datentypen Große, sortierte, schnelle Datenstruktur Java Basics - Anfänger-Themen 9
B Finden gemeinsamer Kanten: welche Datenstruktur ? Java Basics - Anfänger-Themen 9
B Schlange Datenstruktur Java Basics - Anfänger-Themen 16
G Datenstruktur gesucht Java Basics - Anfänger-Themen 14
A Schnelle, dynamische, geordnete Datenstruktur? Java Basics - Anfänger-Themen 11
E Gibt es eine ähnliche Datenstruktur wie eine Hashmap Java Basics - Anfänger-Themen 3
K eigene Hash-Datenstruktur Java Basics - Anfänger-Themen 2
D Was fürne Datenstruktur für Kreuztabelle mit doubles? Java Basics - Anfänger-Themen 1
K Datentyp vs. Datenstruktur - Unterschiede Java Basics - Anfänger-Themen 13
D Was machen wenn Datenstruktur sich ständig ändert? Java Basics - Anfänger-Themen 10
0 Dynamische Datenstruktur ohne Duplikate und mit direkter Elementauswahl Java Basics - Anfänger-Themen 3
G Welche Datenstruktur ( Sets / Maps)? Java Basics - Anfänger-Themen 10
I Datenstruktur eines Terminkalenders Java Basics - Anfänger-Themen 11
K suche nicht dynamisch Datenstruktur Java Basics - Anfänger-Themen 6
M Suche passende Datenstruktur Java Basics - Anfänger-Themen 3
P geeignete Datenstruktur für dreidimensionale Raumbelegung Java Basics - Anfänger-Themen 5
G Suche geeignete Datenstruktur Java Basics - Anfänger-Themen 8
G Baum Datenstruktur Java Basics - Anfänger-Themen 2
U Welche Datenstruktur soll ich nehmen? Java Basics - Anfänger-Themen 11
G Welche Datenstruktur ist hier die sinnvolste Java Basics - Anfänger-Themen 6
G Datenstruktur und die Kommunikation mit der GUI Java Basics - Anfänger-Themen 10
X txt datei in eine datenstruktur einlesen Java Basics - Anfänger-Themen 3
J Datenstruktur Java Basics - Anfänger-Themen 6
G Datenstruktur [int id, int wert] nach wert sortieren? Java Basics - Anfänger-Themen 5
S Welche Datenstruktur für Tabelle/DB? Java Basics - Anfänger-Themen 5
1 Wahl der Datenstruktur für die Suche. Java Basics - Anfänger-Themen 9
G Geeignete Datenstruktur ? Java Basics - Anfänger-Themen 8
N passende Datenstruktur Java Basics - Anfänger-Themen 3
E welche Datenstruktur (Collection) Java Basics - Anfänger-Themen 4
6 Welche Datenstruktur? Java Basics - Anfänger-Themen 3
P Datenstruktur Java Basics - Anfänger-Themen 4
J Kann man Daten innerhalb einer Datenstruktur verändern? Java Basics - Anfänger-Themen 4
K datenstruktur Java Basics - Anfänger-Themen 5
G Datenstruktur abbilden Java Basics - Anfänger-Themen 3
F Welche Datenstruktur für Matrix mit Vektoren? Java Basics - Anfänger-Themen 2
F Gibt es eine Datenstruktur für Koordinaten x, y? Java Basics - Anfänger-Themen 8
E Welche Datenstruktur für Spielbäume? Java Basics - Anfänger-Themen 13
P Datenstruktur gesucht: Array mit Dictionary Java Basics - Anfänger-Themen 2
H Datenstruktur für folgende Daten Java Basics - Anfänger-Themen 8
G Komplexe Datenstruktur (Liste heterogener Datensätze) ? Java Basics - Anfänger-Themen 2
P Welche Datenstruktur um schnell zu suchen? Java Basics - Anfänger-Themen 25
S Datenstruktur für Fahrplan einer Buslinie Java Basics - Anfänger-Themen 7
G Datenbank VS simpler Datenstruktur Java Basics - Anfänger-Themen 3
K Welche Datenstruktur für eine Bibliotheksanwendung? Java Basics - Anfänger-Themen 5
G datenstruktur für jTable? Java Basics - Anfänger-Themen 4
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben