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!
 
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.
 
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
 
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!
 
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;
				
			}
			
		};
	}
	
	
	
	

}
 
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;
				
			}
			
		};
	}
 
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.
 
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???
 
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");	
	}
}
 
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
 
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..
 
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.

Neue Themen


Zurück
Oben