toString Problem

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
ich bin gerade dabei, die Klasse BinarySearchTree um eine Methode toString zu erweitern, die eine Darstellung der einzelnen in dem Baum enthaltenen werte als String liefert (in inorder Reihenfolge).
ich hab hier jetzt mal das ganze programm reingetan, das auch funktioniert hat, bis ich meine toString Methode drangehängt hab... krieg die ganze zeit die fehlermeldung:
BinarySearchTree.java: cannot find symbol
symbol: method r()
location class BinarySearchTree.BSTNode
result = result + toString(root.r());
^
das gleich auch bei root.l...
wär super wenn mir jemand sagen könnte, was ich da falsch mach...
hab jetzt mal den ganzen Baum reingepostet, relevant sind aber nur die letzten paar zeilen...

Code:
public class BinarySearchTree {
 
   protected class BSTNode {
 
      protected Comparable value = null;
 
      protected BSTNode    left  = null;
 
      protected BSTNode    right = null;
 
      protected BSTNode(Comparable v, BSTNode l, BSTNode r) {
         value = v;
         left  = l;
         right = r;
      }
 
      protected boolean containsRecursive(Comparable o) {
         // ist der angegebene Wert gleich dem Wert des aktuellen Knotens?
         if (o.compareTo(this.value) == 0) {
            // ja - wir haben den gesuchten Wert gefunden
            return true;
         } else {
            // nein - wir müssen entweder im linken oder im rechten Unterbaum weitersuchen
            if (o.compareTo(this.value) < 0) {
               // der gesuchte Wert kann nur im linken Unterbaum sein
               if (left == null) {
                  // es gibt keinen linken Nachfolger, der gesuchte Wert ist nicht enthalten
                  return false;
               } else {
                  // im linken Unterbaum (rekursiv) weitersuchen
                  return left.containsRecursive(o);
               }
            } else {
               // der gesuchte Wert kann nur im rechten Unterbaum sein
               if (right == null) {
                  // es gibt keinen rechten Nachfolger, der gesuchte Wert ist nicht enthalten
                  return false;
               } else {
                  // im rechten Unterbaum (rekursiv) weitersuchen
                  return right.containsRecursive(o);
               }
            }
         }
      }
 
    
      protected boolean addRecursive(Comparable o) {
         if (o.compareTo(this.value) == 0) {
            return false;
         } else {
            if (o.compareTo(this.value) < 0) {
               if (left == null) {
                  left = new BSTNode(o, null, null);
                  return true;
               } else {
                  return left.addRecursive(o);
               }
            } else {
               if (right == null) {
                  right = new BSTNode(o, null, null);
                  return true;
               } else {
                  return right.addRecursive(o);
               }
            }
         }
      }
 
   
      protected void print(int level) {
         if (left != null) left.print(level + 1);               // linken Unterbaum ausgeben
         for (int i=0; i<level; i=i+1) System.out.print("   "); // Einrückung
         System.out.println(this.value);                        // Knotenwert
         if (right != null) right.print(level + 1);             // rechten Unterbaum ausgeben
      }
 
     
      protected int size() {
         int leftSize, rightSize;
         if (left == null) {
            leftSize = 0;
         } else {
            leftSize = left.size();
         }
         if (right == null) {
            rightSize = 0;
         } else {
            rightSize = right.size();
         }
         return 1 + leftSize + rightSize;
      }
 
     
      protected int height() {
         int leftHeight, rightHeight;
         if (left == null) {
            leftHeight = -1;
         } else {
            leftHeight = left.height();
         }
         if (right == null) {
            rightHeight = -1;
         } else {
            rightHeight = right.height();
         }
         return 1 + Math.max(leftHeight, rightHeight);
      }
 
   }
 
 
   protected BSTNode root = null;
 
  
   public boolean containsRecursive(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      return (root != null) && root.containsRecursive(o);
   }
 

   public boolean contains(Comparable o) {
      return this.containsRecursive(o);
   }
 
 
   public boolean containsIterative(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      BSTNode node = root;
      while (node != null) {
         // ist der angegebene Wert gleich dem Wert des aktuellen Knotens?
         if (o.compareTo(node.value) == 0) {
            // ja - wir haben den gesuchten Wert gefunden
            return true;
         } else {
            // nein - wir müssen entweder im linken oder im rechten Unterbaum weitersuchen
            if (o.compareTo(node.value) < 0) {
               // der gesuchte Wert kann nur im linken Unterbaum sein
               node = node.left;
            } else {
               // der gesuchte Wert kann nur im rechten Unterbaum sein
               node = node.right;
            }
         }
      }
      // der gesuchte Wert ist nicht enthalten
      return false;
   }
 
  
   public boolean addRecursive(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      if (root == null) {
         root = new BSTNode(o, null, null);
         return true;
      } else {
         return root.addRecursive(o);
      }
   }
 

   public boolean add(Comparable o) {
      return this.addRecursive(o);
   }
 
  
   public boolean addIterative(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      if (root == null) {
         root = new BSTNode(o, null, null);
         return true;
      } else {
         BSTNode node = root;
         while (true) {   // "Endlosschleife" wird durch return verlassen
            if      (o.compareTo(node.value) == 0) return false;
            else if (o.compareTo(node.value) <  0) {
               if (node.left == null) {
                  node.left = new BSTNode(o, null, null);
                  return true;
               } else {
                  node = node.left;
               }
            } else {
               if (node.right == null) {
                  node.right = new BSTNode(o, null, null);
                  return true;
               } else {
                  node = node.right;
               }
            }
         }
      }
   }
 
 
   public void print() {
      if (root != null) root.print(0);
   }
 

   public int size() {
      if (root == null) return 0;
      else              return root.size();
   }
 
 
   public int height() {
      if (root == null) return -1;
      else              return root.height();
   }
 
public boolean isEmpty( )
    {
        return root == null;
    }
public String toString(BSTNode root) {

String result = "";
        if (root == null) 
return result;
            result = result + toString(root.l()) + " ";
            result = result + root.toString() + " ";
            result = result + toString(root.r());
    
        return result;
 }   
}
 
Naja, die Methoden l() und r() existieren in der Klasse BSTNode nicht, ich denke du meinst left und right (die Attribute)
Sollte wahrscheinlich so aussehen:
Code:
public String toString(BSTNode root) {
        String result = "";
        if (root == null)
                return result;
        result = result + toString(root.left) + " ";
        result = result + root.toString() + " ";
        result = result + toString(root.right);
   
        return result;
}
 
so hätt ichs eigentlich vorher probiert, hab aber die gleiche fehlermeldung bekommen -.-
lag wohl an den falschen klammern die ich da gemacht hab... danke 🙂

jetzt hab ich noch das problem, dass ich das ganze ja testen soll...
Code:
public class Testklasse1 {

public static void main(String[] args) {

BinarySearchTree bst = new BinarySearchTree();

System.out.println(bst.add(15));
System.out.println(bst.add(3));
System.out.println(bst.isEmpty());
System.out.println(bst.toString);

bst.print();

}
}

und da krieg ich für toString BinarySearchTree@1ad086a als antwort...
 
was willst du denn stattdessen haben? irgendwas, was mit der Operation
public String toString(BSTNode root); zu tun hat?

dann überlege dir doch mal mal wer die aufruft,
Java wird ganz bestimmt nicht das root-Objekt nehmen und damit irgendeine Operation aufrufen,
das musst du schon selber machen
 
Dazu mußt du die Methode

Code:
public String toString()

(ohne Parameter) überschreiben aber diese Methode kann sich ja
auf deine toString-Methode mit Parameter beziehen
(musste nicht alles doppelt machen...)
 
oder hab ich etwas falsch verstanden und das was er ausgibt passt?
 
Deine Methode toString(BSTNode root) wird nicht aufgerufen, weil du nur toString() ohne Parameter aufrufst. toString() hat jedes Objekt, daher bekommst du keine Meldung sondern die Standard-Implementierung wird aufgerufen (also die von Object).
 
Code:
System.out.println(bst.toString(BSTNode root));

so funzts auch nicht... oder muss ich das ganz anders schreiben?
 
deine Zeile ist kein korrekte Code, insofern ja, du musst was anderes schreiben,

versetzt dich dochmal in die Lage des Computers 😉
da wiederholt jemand den Typ des Parameters der Operation,
das machst doch sonst niemand, selbst du wirst doch schon ein paar Operationsaufrufe geschrieben haben?

schau dir deinen Code oben an:
> result = result + toString(root.l()) + " ";
ist korrekt, aber wenn du da
result = result + toString(BSTNode root) + " ";
schreiben würdest, das wäre doch falsch, ist doch sonnenklar?

so und als zweiter Punkt in die Lage des Computers hineinversetzt:
WELCHER BSTNode soll da als Parameter übergeben werden?
du musst genau sagen was du haben willst, der Computer kann doch nicht nicht den richtigen für dich raten
 
ist das nur für mich so kompliziert? bei add geht dass doch auch so einfach^^
ich krieg einfach nur fehlermeldungen, egal was ich da eintippe...
 
Hi,

vielleicht nochmal in anderen Worten:
Es gibt keine Methodenaufrufe in denen der Typ eines Parameters mitgegeben wird. Man übergibt immer nur den Namen einer Variable. Sollte Dir klar sein...vielleicht mal ne Stunde nix machen 🙂

Was oben gemeint war:
Du hat die Methode toString überschrieben, die einen Parameter erwartet. Du hast aber nicht die Methode toString() überschrieben, die keinen Parameter erwartet. Überladungen kennzeichnen sich durch die Signatur(parameterliste) aus. Auch das solltest Du wissen 😉 ..vielleicht mal schlafen .. 🙂
Also überschreibe zusätzlich noch die toString ohne Parameter und rufe die toString mit Parameter auf, wobei Du irgendwas von Dir definiertes übergibts, damit Du nicht beide Methoden ändern musst. Klar?

greetz
SLi

PS: Aufrufe werden zusätzlich noch mit Klammerauf und Klammerzu geschrieben 😉...Schlafen usw....
 
schlafen wär sicher ne gute idee 😀
aber ich kann nicht schlafen solang ich nicht weiß wie das funktioniert 😀 das beschäftigt mich die ganze zeit...
könntest du mir vielleicht konkret hinschreiben wie das aussehen soll?
 
Grml...

...die Sätze wären eigentlich ausreichend!
Aber da ich eh jetzt ins Bett gehe.... 😉

1. tes Problem:
Code:
public class Testklasse1 {

public static void main(String[] args) {

BinarySearchTree bst = new BinarySearchTree();

System.out.println(bst.add(15));
System.out.println(bst.add(3));
System.out.println(bst.isEmpty());
System.out.println(bst.toString());
}
}

Die Klammern setzen beim Aufruf.

Zweites Problem:
Code:
public class BinarySearchTree {

   protected class BSTNode {

      protected Comparable value = null;

      protected BSTNode    left  = null;

      protected BSTNode    right = null;

      protected BSTNode(Comparable v, BSTNode l, BSTNode r) {
         value = v;
         left  = l;
         right = r;
      }

      protected boolean containsRecursive(Comparable o) {
         // ist der angegebene Wert gleich dem Wert des aktuellen Knotens?
         if (o.compareTo(this.value) == 0) {
            // ja - wir haben den gesuchten Wert gefunden
            return true;
         } else {
            // nein - wir müssen entweder im linken oder im rechten Unterbaum weitersuchen
            if (o.compareTo(this.value) < 0) {
               // der gesuchte Wert kann nur im linken Unterbaum sein
               if (left == null) {
                  // es gibt keinen linken Nachfolger, der gesuchte Wert ist nicht enthalten
                  return false;
               } else {
                  // im linken Unterbaum (rekursiv) weitersuchen
                  return left.containsRecursive(o);
               }
            } else {
               // der gesuchte Wert kann nur im rechten Unterbaum sein
               if (right == null) {
                  // es gibt keinen rechten Nachfolger, der gesuchte Wert ist nicht enthalten
                  return false;
               } else {
                  // im rechten Unterbaum (rekursiv) weitersuchen
                  return right.containsRecursive(o);
               }
            }
         }
      }

   
      protected boolean addRecursive(Comparable o) {
         if (o.compareTo(this.value) == 0) {
            return false;
         } else {
            if (o.compareTo(this.value) < 0) {
               if (left == null) {
                  left = new BSTNode(o, null, null);
                  return true;
               } else {
                  return left.addRecursive(o);
               }
            } else {
               if (right == null) {
                  right = new BSTNode(o, null, null);
                  return true;
               } else {
                  return right.addRecursive(o);
               }
            }
         }
      }

   
      protected void print(int level) {
         if (left != null) left.print(level + 1);               // linken Unterbaum ausgeben
         for (int i=0; i<level; i=i+1) System.out.print("   "); // Einrückung
         System.out.println(this.value);                        // Knotenwert
         if (right != null) right.print(level + 1);             // rechten Unterbaum ausgeben
      }

     
      protected int size() {
         int leftSize, rightSize;
         if (left == null) {
            leftSize = 0;
         } else {
            leftSize = left.size();
         }
         if (right == null) {
            rightSize = 0;
         } else {
            rightSize = right.size();
         }
         return 1 + leftSize + rightSize;
      }

     
      protected int height() {
         int leftHeight, rightHeight;
         if (left == null) {
            leftHeight = -1;
         } else {
            leftHeight = left.height();
         }
         if (right == null) {
            rightHeight = -1;
         } else {
            rightHeight = right.height();
         }
         return 1 + Math.max(leftHeight, rightHeight);
      }

   }


   protected BSTNode root = null;

 
   public boolean containsRecursive(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      return (root != null) && root.containsRecursive(o);
   }


   public boolean contains(Comparable o) {
      return this.containsRecursive(o);
   }


   public boolean containsIterative(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      BSTNode node = root;
      while (node != null) {
         // ist der angegebene Wert gleich dem Wert des aktuellen Knotens?
         if (o.compareTo(node.value) == 0) {
            // ja - wir haben den gesuchten Wert gefunden
            return true;
         } else {
            // nein - wir müssen entweder im linken oder im rechten Unterbaum weitersuchen
            if (o.compareTo(node.value) < 0) {
               // der gesuchte Wert kann nur im linken Unterbaum sein
               node = node.left;
            } else {
               // der gesuchte Wert kann nur im rechten Unterbaum sein
               node = node.right;
            }
         }
      }
      // der gesuchte Wert ist nicht enthalten
      return false;
   }

 
   public boolean addRecursive(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      if (root == null) {
         root = new BSTNode(o, null, null);
         return true;
      } else {
         return root.addRecursive(o);
      }
   }


   public boolean add(Comparable o) {
      return this.addRecursive(o);
   }

 
   public boolean addIterative(Comparable o) {
      if (o == null) throw new IllegalArgumentException();
      if (root == null) {
         root = new BSTNode(o, null, null);
         return true;
      } else {
         BSTNode node = root;
         while (true) {   // "Endlosschleife" wird durch return verlassen
            if      (o.compareTo(node.value) == 0) return false;
            else if (o.compareTo(node.value) <  0) {
               if (node.left == null) {
                  node.left = new BSTNode(o, null, null);
                  return true;
               } else {
                  node = node.left;
               }
            } else {
               if (node.right == null) {
                  node.right = new BSTNode(o, null, null);
                  return true;
               } else {
                  node = node.right;
               }
            }
         }
      }
   }


   public void print() {
      if (root != null) root.print(0);
   }


   public int size() {
      if (root == null) return 0;
      else              return root.size();
   }


   public int height() {
      if (root == null) return -1;
      else              return root.height();
   }

public boolean isEmpty( )
    {
        return root == null;
    }
public String toString(BSTNode root) {

String result = "";
        if (root == null)
return result;
            result = result + toString(root.l()) + " ";
            result = result + root.toString() + " ";
            result = result + toString(root.r());
   
        return result;
}   

public String toString() {

BSTNode root = // irgendetwas was Du definierst. Keine Ahnung welchen BSTNode zu da nehmen willst. Gucke nur berflächlich drauf

return (this.toString(root));

// Alternativ schreib die Methode neu, wenn Du ein anderes Verhalten haben willst
}   

}

Wie gesagt. toString nochmal überschreiben...nur die ohne Parameter.

n8
SLi
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben