Avatar billede Peter Praktikant
11. maj 2002 - 18:14 Der 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?
Avatar billede erikjacobsen Ekspert
11. maj 2002 - 18:23 #1
Forklar lige hvad data og point indeholder, og hvad du vil have som resultat. Det
er temmelig tåget, både det du siger, og det du gør.
Avatar billede Peter Praktikant
11. maj 2002 - 18:34 #2
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?
Avatar billede erikjacobsen Ekspert
11. maj 2002 - 18:36 #3
Ikke godt nok :)  Prøv at tegne det, med konkrete værdier - eller la' vær' og vent til
der kommer nogen kvikkere forbi *G*
Avatar billede Peter Praktikant
12. maj 2002 - 17:22 #4
jeg lukker spørgsmålet da jeg desværre ikke kan forklare det bedre.
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 17:46 #5
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.
Avatar billede Peter Praktikant
12. maj 2002 - 18:01 #6
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:

(1,1,1,1) (0,1,2,3)
(0,1,2,3) (1,2,3,4)
(1,2,3,4) (2,3,4,5)
(2,3,4,5) (3,4,5,6)
(3,4,5,6) (2,2,2,2)

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.
Avatar billede Peter Praktikant
12. maj 2002 - 18:02 #7
jeg havde forventet dette resultat
(0,1,2,3) (1,2,3,4)
(1,2,3,4) (2,3,4,5)
(2,3,4,5) (3,4,5,6)

og ikke det jeg får.
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 18:03 #8
Hvad er det for en udskrift du ønsker ??
Avatar billede Peter Praktikant
12. maj 2002 - 18:04 #9
denne
(0,1,2,3) (1,2,3,4)
(1,2,3,4) (2,3,4,5)
(2,3,4,5) (3,4,5,6)
Avatar billede Peter Praktikant
12. maj 2002 - 18:05 #10
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.
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 18:10 #11
Du siger aldrig data.next() men det er nok blandt de linier du har slettet, ikke?

Jeg tror vi skal se alle linier, for du må have fjernet noget væsentligt,
Avatar billede Peter Praktikant
12. maj 2002 - 18:33 #12
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.
Avatar billede Peter Praktikant
12. maj 2002 - 18:40 #13
while(funcCont.funcNext()){
  if(funcCont.pointNext()){
      p3D = funcCont.nextPoint();
      p2D = trans.convert(p3D);
  }
  while(funcCont.pointNext()){
      q3D = funcCont.nextPoint();
      q2D = trans.convert(q3D);
      g.drawLine(p2D.getX(),p2D.getY(),q2D.getX(),q2D.getY());
  }
  p2D = q2D;
}

while (j < coords.length){
  LinePiece l = coords[j];
  p3D.setCoords(l.getX1(),l.getY1(),l.getZ1());
  q3D.setCoords(l.getX2(),l.getY2(),l.getZ2());
  l2D = trans.convert(p3D);
  m2D = trans.convert(q3D);
  g.drawLine(l2D.getX(),l2D.getY(),m2D.getX(),m2D.getY());
  j++;
}
Avatar billede Peter Praktikant
12. maj 2002 - 18:45 #14
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).
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 19:00 #15
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.
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 19:05 #16
Og endelig kan det være en sammenblanding af objekter og referencer til
objekter. F.eks. vil p2D = q2D; kun lave en kopi af referencer.
Avatar billede Peter Praktikant
12. maj 2002 - 19:05 #17
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();
}
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 19:14 #18
Kan du forlare hvorfor den ikke hedder

public Point nextPoint(){
  Point p = (Point) points.next();
  return (Point) p.clone();
}

??
Avatar billede Peter Praktikant
12. maj 2002 - 19:17 #19
det er fordi der er en linje længere nede

private Point p;

Jeg vil ikke lave et nyt Point hver gang den bliver kaldt da den kaldes mange gange.
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 19:18 #20
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* )
Avatar billede Peter Praktikant
12. maj 2002 - 19:37 #21
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:)).
Avatar billede erikjacobsen Ekspert
12. maj 2002 - 19:44 #22
nej nej, det skal du ikke. Det er da dejligt det lykkes.
Avatar billede Peter Praktikant
12. maj 2002 - 23:30 #23
ja, men tak for hjælpen så.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester