Problemet er vel at inFixNot findes per objekt. Dermed et det ikke samme variabel du rammer med += data
Jeg vil tro at du skal sende strengen med i alle kald, så der kan blive bygget videre på den:
String inFixNot = "";
inFixNot=infix(inFixNot);
public String infix(String result){
if(left != null)
result += left.infix(result);
result += data;
if(right != null)
result += right.infix(result);
return result;
}
--
http://tjens.dk[...]
Her kan du let formattere dine indkøbslister, så de vises pænt i trådene her på HOL Ser også sådan ud her fra...
//Torben
--
Jep :) Var hvad jeg kunne se, at den lavede en ny varable for hvert rekursivt kald.
Men når jeg skriver linien "inFixNot = infix(inFixNot); " ind som du har skrevet #1, så kommer der en rød linie under, og den skriver følgende:
expected.
Så kan ikke helt få det til at virke.
Tak for svarene.
--
expected er en ret kort fejlmelding :-)
Kan du vise et par linier før og efter her i forumet?
Eller en helt anden løsning:
Lav String inFixNot static, og flyt den uden for objekterne.
Så skulle din oprindelige kode nok virke.
--
http://tjens.dk[...]
Her kan du let formattere dine indkøbslister, så de vises pænt i trådene her på HOL Ja, undskyld.
Det er Identifier med trekansts-parateser
--
Hov forresten:
infix er vel en objektmetode. Så det skal være
inFixNot=this.infix(inFixNot);
eller
inFixNot=treetop.infix(inFixNot);
eller hvad dit rod-objekt hedder.
--
http://tjens.dk[...]
Her kan du let formattere dine indkøbslister, så de vises pænt i trådene her på HOL Ja det er this.
Men når så jeg skriver det siger den stadig indentifier excepted.
Og i lininen som jeg så skriver som:
inFixNot = this.infix(inFixNot);
er den første inFixNot IKKE grøn, men den i parateserne er.
Smider lige lidt mere kode ind, sådan er det ud nu:
// Indlæsning af Objekt, og Noder:
public class Node {
private Object data;
private Node right;
private Node left;
String test = "";
// Konstruktor:
public Node(Node leftChild, Node rightChild, Object root){
this.data = root;
this.right = rightChild;
this.left = leftChild;
}
Og så min infix, som skal skrive infixnotationen til en streng, som er hvor problemet er:
static String inFixNot = "";
inFixNot = this.infix(inFixNot);
public String infix(String result){
if(left != null)
left.infix(result);
result += data;
if(right != null)
right.infix(result);
return result;
}
Beklager at indrykningen ikke virker, håber ikke det er for uoverskueligt.
--
Jeg har kigget lidt på og kan ikke gennemskue hvad der går galt. Importerede det hele i eclipse og fik en mærkelig token fejl:
static String inFixNot = "";
--
www.dancewiththedr.frac.dk[...] Hm... Altså kan ikke 100% gennemskue hvad det er koden skal gøre... Men som jeg forstår det...
Først og fremmest er der et potentielt problem med at du passer en string parameter til metoden, og forsøger at bygge videre på den. Det kan man ikke umiddelbart i Java, da Java ikke i bogstavelig forstand overfører parametre per reference... Det forklarer i hvert fald den tomme streng.
//Torben
--
Har lige læst tråden igennem, kan godt forstå du ikke er helt med #9 :) Vil lige prøve at forklare mig lidt bedre.
Jeg har i noget foregående kode lavet et binært evalueringstræ som er en knude der har to børn, og de kan så indeholde nye knuder, og så fremdeles. (dette virker)
Det jeg så skal lave nu, er at jeg skal have en metode, som jeg skal kunne kalde senere fra min main metode ved f.eks. at skrive treeName.infix(), og så skal der returneres en streng som skriver mit træ ud i infix-notation.
Derfor skal jeg, hvis mit evalæeringtræ har + i roden, 2 i venstre barn, og 7 i højre barn, returnere en streng der indeholder 2 + 7. (Og dette skal så gælde rekursivt hvis et barn igen har børn.)
Hvis jeg sætte en System.out.println(data) ind i stedet for det hvor jeg prøver at forlænge min String, så skriver den det ud i den rigtige rækkefølge, men jeg skal bare finde en måde hvorpå jeg kan "skrive" til en og samme streng.
Tak ;)
--
Så virker det. Lavede den static, og så fjernede jeg argumentet :)
Nu ser den sådan ud:
static String result = "";
public String infix(){
if(left != null)
left.infix();
result += data;
if(right != null)
right.infix();
return result;
}
Og det ser ud som om den gør hvad den skal.
Men mange mange tak til jer der har hjulpet mig :)
--
#10 Ok... Såfremt din rekursive algoritme funker, og du kravler korrekt rundt i træet, tror jeg det letteste er at sætte din metode til at returnere en String, og så opbygge det på den måde...
... Javas håndtering af metodeparametre er 'by reference', men du kan ikke bruge parametren til at opbygge en string. Dette skyldes (som sådan) 2 ting... For det første er den refenrence som bliver passed, en reference til et object, (eller dettes hukommelsesadresse), det betyder at hvis du sætter dette objekt = et andet objekt i en metode, ændrer du ikke det oprindelige objekt.
En anden ting er, at Javas String klasse er en wrapper over et array af chars (hvilket jo har en statisk størrelse !). Dette betyder reelt, at du ikke har mulighed for at forlænge en String som sådan. Bag facaden skaber JVM'en et helt nyt char array hver gang du forsøger at forlænge dit String object, og dermed en ny reference...
Som eks. kan du prøve denne lille spike...
public class ParameterManipulator {
private String newString;
public ParameterManipulator(String newString) {
this.newString = newString;
}
public String manipulateString(String string) {
string = newString;
return newString;
}
public static void main(String[] args) {
String name = "Anders";
ParameterManipulator man = new ParameterManipulator("John");
man.manipulateString(name);
System.out.println(name);
name = man.manipulateString(name);
System.out.println(name);
}
}
Den viser på en relativt simpel måde hvad jeg mener...
Hvis du insisterer på at have void returntype, kan du jo altid wrappe dit String object i en dummyklasse, så burde det lade sig gøre... Something like...
public class DummyClass {
private String dummyString;
public DummyClass() {
dummyString="";
}
public DummyClass(String dummyString) {
this.dummyString = dummyString;
}
public String getDummyString() {
return dummyString;
}
public void setDummyString(String dummyString) {
this.dummyString = dummyString;
}
}
public class ParameterManipulator {
private String newString;
public ParameterManipulator(String newString) {
this.newString = newString;
}
public String manipulateString(String string) {
string = newString;
return newString;
}
public void manipulateDummyClass(DummyClass dummy, String string){
dummy.setDummyString(string);
}
public static void main(String[] args) {
String name = "Anders";
ParameterManipulator man = new ParameterManipulator("John");
man.manipulateString(name);
System.out.println(name);
name = man.manipulateString(name);
System.out.println(name);
DummyClass dummy = new DummyClass("Anders");
man.manipulateDummyClass(dummy, name);
System.out.println(dummy.getDummyString());
}
}
--
Hæhæ... At erklære den static er selvfølgelig også en mulighed... Så er det jo pr. definition den samme variabel der referes til...
//Torben
--
edit: Skrevet før 11,12 og 13
Det jeg mente med static var at din oprindelige kode ville virke.
Dog skal infix() ikke returnere noget, fordi resultatet bliver opsamlet en den enlige static variabel.
public static String inFixNot;
public void infix(){
if(left != null)
left.infix();
inFixNot += data;
if(right != null)
right.infix();
}
==============================================
Mit forslag i #1 er forkert, fordi hele String objektet result bliver sendt med som reference, og dermed bliver indholdet "fordoblet" for hver forgrening.
Jeg skulle i stedet have lavet en lokal ny streng at bygge videre på:
public String infix(){
String result = "";
if(this.left != null) {
result += this.left.infix();
}
result += this.data;
if(this.right != null){
result += this.right.infix();
}
return result;
}
I dette tilfælde er der ikke brug for String inFixNot i objektet.
inFix kaldes i main rutinen således:
String inFixNot = "";
inFixNot = rootnode.infix();
System.out.println(inFixNot);
--
http://tjens.dk[...]
Her kan du let formattere dine indkøbslister, så de vises pænt i trådene her på HOL NICE!
Det ser ud til at virke på denne sidste måde.
Jamen jeg takker.
--