11. maj 2002 - 18:14Der er
22 kommentarer og 1 løsning
Et problem med en LinkedList og en iterator.
Hej igen, jeg har endnu et problem som jeg undrer mig meget over. Jeg har denne metode i en klasse:
public void printValues(){ Point p = new Point(); Point q = new Point();
while(data.hasNext()){ if(point.hasNext()){ p = point.next(); } while(point.hasNext()){ q = point.next(); p.print(); q.print(); p = q; } } p = new Point(1,1,1,1); q = new Point(2,2,2,2); }
jeg ser lige om jeg kan forklare det lidt bedre, for det er sådan set koden hvor jeg bare har klippet nogle linjer væk som er ligegyldige for forklaringen. data og point er begge Iterator som hører til hver deres LinkedList. Det vil sige, meningen med kodestumpen er, at udskrive alle punkterne i hver LinkedList parvis. Men sådan går det ikke. For det første element i DataList som data-iteratoren kører igennem virker det fint. Men når det sidste element pilles frem og køres igennem med point-iteratoren starter den med at skrive (1,1,1,1) og ikke det første element i den LinkedList der hører til point-iteratoren. Herefter går det fint indtil den skriver det sidste element, dette er nemlig (2,2,2,2) som heller ikke ligger i den LinkedList. Så det ser nogenlunde sådan ud: (a,b,c,d) er objekter i den LinkedList der hører til point-iteratoren.
(1,1,1,1) a a b b c c d d (2,2,2,2) hvor det skulle have været a b b c c d
Hvorfor kommer det q og det p, der først bliver defineret senere ind i while-løkken?
okay data og point er begge iteratorer der hører til hver sin linkelist. data itererer igennem en LinkedList der består af functions-objects. Disse har hver en LinkedList som point itererer igennem, denne består af Point. Så koden skulle skrive disse Point ud parvis for hver Function i mønstret angivet ovenfor. Men problemet er så, at hvis jeg bagefter ligger nogle andre Point ned i p og q kommer de med i udskriften ud over dem der i forvejen lå i den sidste LinkedList med Point. Hvorfor gør de det?
Det er så i orden. Men jeg bad dig jo egentlig bare om at komme med nogle konkrete værdier i listerne, med det ønskede resultat. Hvis jeg skal være meget fræk, så har du ikke forstået dit problem, hvis ikke du kan gøre det.
Jeg vil meget gerne prøve igen, jeg mener dog jeg har forstået mit problem, men har til gengæld ingen idé om hvorfor det er der. Men metoden skulle printe alle værdier af objekterne i listen ud i par. Det jeg gør er, at jeg først kører en liste (en LinkedList vi kan kalde A) igennem der består af lister (ligeledes LinkedList vi kalder B) indeholdende Point. p.print, hvor p er et Point, udskriver værdierne af de forskellige koordinater i p. Så hvis p=(0,1,2,3) er resultatet af p.print: (0,1,2,3). Problemet opstår først ved sidste element af A, så her vil jeg skrive hvad der bliver printet:
B består af Point-objekter. Disse ved jeg ikke hvad er på forhånd, men vi kan sige de er a=(0,1,2,3), b=(1,2,3,4), c=(2,3,4,5), d=(3,4,5,6). I koden har jeg så valgt at kalde det første element jeg henter for p og det andet for q. Når jeg så kalder metoden printValues får jeg følgende udskrift:
Det er her problemet er, hvorfor starter metoden med at skrive (1,1,1,1) som jeg jo først sætter senere, og hvorfor slutter den med at skrive (2,2,2,2) som jeg jo heller ikke har givet q værdien endnu. Du må endelig skrive hvis jeg skal udspecificere noget.
jeg forstår ikke hvordan det kan være de p og q som ikke er elementer i B kan snige sig ind i while-løkken, det er det jeg gerne vil vide hvorfor det sker.
data.next() bliver faktisk kaldt igennem data.hasNext(). I virkeligeheden er der en metode der hedder hasNext() som returnerer en boolean og går til næste element i A. Jeg kan godt poste noget mere kode.
når jeg så får billedet frem tegner den fint alle de linjer der hører til den første while-løkke, den tegner også fint de linjer der hører til den sidste while-løkke. Men den forbinder det sidste q3D i hver af de 2, og det samme med p3D, men da der kun er et p3D i den første while-løkke er det det punkt der bliver forbundet til det sidste p3D i sidste løkke. Jeg ved ikke om det blev klarere af at få den rigtige kode, jeg synes ikke det er klart overhovedet hvorfor det sker. funcCont er en reference til en anden klasser indeholdende metoder der styrer iteratoren. coords er defineret tidligere og består af linjestykker (objekter).
Nu snakker vi så ikke en "normal" iterator, der er leveret med Java - hvis man skal sige det sådan. Det kunne jo være den iterator, der er noget galt med.
jo, det er en normal iterator. Her er koden for de andre metoder: public boolean funcNext(){ boolean next = func.hasNext(); if(next){ f = (Function) func.next(); points = f.getPoints().iterator(); } return next; }
public boolean pointNext(){ return points.hasNext(); }
public Point nextPoint(){ p = (Point) points.next(); return (Point) p.clone(); }
Jamen, det gør du da heller ikke. next() afleverer en reference. (Altså, det er ikke fordi jeg tror det er problemet, men lad os nu langsomt grave os igennem *gg* )
juhuu, jeg har fundet ud af det. Før brugte jeg ikke clone og det har selvfølgelig bevirket at de 2 Point, p3D og q3D er blevet overskrevet og derfor har været ændret næste gang metoden blev kaldt. Giver det nogen mening? Metoden bliver kaldt hele tiden, så første gang har det været i orden, men det har jeg ikke kunne nå at se da metoden genererer billeder (24 sek). Men det korte af det lange er, at de 2 Point i LinkedList B er blevet overskrevet med nye værdier. Tak fordi du ville tage dig tid til at hjælpe, hvis du vil kan jeg oprette et spørgsmål med nogle point til dig (ikke q3D og p3D, men rigtige point:)).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.