Seneste forumindlæg
Køb / Salg
 * Uofficiel Black/White liste V3
Login / opret bruger

Forum \ Programmering og webdesign \ Programmering
Denne tråd er over 6 måneder gammel

Er du sikker på, at du har noget relevant at tilføje?

JAVA - Binært træ - infix

Af Monsterbruger CBT | 19-11-2008 21:24 | 2600 visninger | 15 svar, hop til seneste
Hej alle sammen. Jeg har et lille problem med min kode. Det jeg gerne vil, er at skrive alle pladserne i mit træ til ind i en streng, som jeg så senere kan udskrive. Sådan ser min kode ud nu: String inFixNot = ""; public String infix(){ if(left != null) left.infix(); inFixNot += data; if(right != null) right.infix(); return inFixNot; Hvor left og right er knuderne i træet, og data er roden. --- Det der sker er at den ikke overfører variablerne. Jeg har prøvet at køre den igennem, og den læser rigtigt nok fra de forskellige knuder, men det er kun den sidste "data" der bliver udskrevet. Håber der er nogle der ved noget, ellers spørg hvis i skal vide mere om det.
--
#1
tjens
Elite Supporter
19-11-2008 21:51

Rapporter til Admin
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
#2
XR600
Monsterbruger
19-11-2008 22:25

Rapporter til Admin
Ser også sådan ud her fra... //Torben
--
#3
CBT
Monsterbruger
19-11-2008 22:34

Rapporter til Admin
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.
--
#4
tjens
Elite Supporter
19-11-2008 22:43

Rapporter til Admin
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
#5
CBT
Monsterbruger
19-11-2008 22:50

Rapporter til Admin
Ja, undskyld. Det er Identifier med trekansts-parateser
--
#6
tjens
Elite Supporter
19-11-2008 22:50

Rapporter til Admin
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
#7
CBT
Monsterbruger
19-11-2008 23:00

Rapporter til Admin
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.
--
#8
Dr. Dance
Monsterbruger
20-11-2008 02:02

Rapporter til Admin
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[...]
#9
XR600
Monsterbruger
20-11-2008 09:26

Rapporter til Admin
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
--
#10
CBT
Monsterbruger
20-11-2008 12:59

Rapporter til Admin
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 ;)
--
#11
CBT
Monsterbruger
20-11-2008 14:04

Rapporter til Admin
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 :)
--
#12
XR600
Monsterbruger
20-11-2008 14:17

Rapporter til Admin
#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()); } }
--
#13
XR600
Monsterbruger
20-11-2008 14:24

Rapporter til Admin
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
--
#14
tjens
Elite Supporter
20-11-2008 14:27

Rapporter til Admin
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
#15
CBT
Monsterbruger
20-11-2008 14:32

Rapporter til Admin
NICE! Det ser ud til at virke på denne sidste måde. Jamen jeg takker.
--

Opret svar til indlægget: JAVA - Binært træ - infix

Grundet øget spam aktivitet fra gæstebrugere, er det desværre ikke længere muligt, at oprette svar som gæst.

Hvis du ønsker at deltage i debatten, skal du oprette en brugerprofil.

Opret bruger | Login
NYHEDSBREV
Afstemning