Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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");
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");
}
}
}
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!
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.
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");
}
}
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..
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