Avatar billede mmp Nybegynder
25. november 2003 - 10:25 Der er 18 kommentarer og
1 løsning

Gentagne gennemløb af en Iterator

Jeg sidder med en lille liste (ArrayList, supertype List) bestående af nogle objekter, som jeg vil hente fra en ende af igen og igen.
Spørgsmålet er, om man kan gøre det med en Iterator ???? I givet fald måske med brug af modulus - men hvordan. Jeg kan sagtens løbe listen igennem igen og igen ved at sætte i=0, når i == list.size() - men hvordan får man det til at fungere med en iterator ????

Her er min kode:

if(!co.isEmptyEnemyList()){
                        if(i==co.getEnemyListSize())
                            i=0;
           
                            absEnemy = co.getEnemy(i);
                            if(absEnemy.getY()<=450)
                                absEnemy.move();       
                            else                                 absEnemy.setY(0);
                            if(shotGo)
                                modelShot.move();
                            i++;
                    }
Avatar billede erikjacobsen Ekspert
25. november 2003 - 10:31 #1
Du laver bare en ny Iterator til hvert gennemløb.
Avatar billede arne_v Ekspert
25. november 2003 - 10:38 #2
Hvorfor vil du bruge iterator ?

En for løkke lyder da meget mere praktisk !
Avatar billede mmp Nybegynder
25. november 2003 - 11:08 #3
Det er også min mening - men jeg befinder mig i en gruppe, der er af en anden mening og fordi det er en opgave i at benytte en masse forskellige Patterns, så er det gennemtrumfet, at Iterator skal anvendes. Ulogisk argument - men det er årsagen.
Avatar billede arne_v Ekspert
25. november 2003 - 11:21 #4
Så får I da demonstreret, at I ikke har forstået patterns ...

Nå men jeg kan forstå, at den diskussion er afsluttet.

Så må det vel være:

while(iwanttocontinuelooping) {
    Iterator it = lst.iterator();
    while(it.hasNext()) {
        X x = (X)it.next();
        // process x
    }
}
Avatar billede mmp Nybegynder
25. november 2003 - 11:36 #5
Øhmmmm..... ja, det er også min mening..... jeg tror, jeg vil henvise til svarene her ;-)

Bortset fra det, så var det "iwanttocontinuelooping", jeg spurgte til - hvordan skal det se ud?
Avatar billede arne_v Ekspert
25. november 2003 - 11:50 #6
Der må vel være et eller andet som styrer hvor længe i skal
fortsætte med at løbe gennem data ?
Avatar billede mmp Nybegynder
25. november 2003 - 12:07 #7
Ja, det er rigtigt - men det skal vi ligeså længe programmet kører, så på et tidspunkt returnerer i.hasNext() false og så skal vi gerne starte forfra i listen igen, igen, igen
Avatar billede erikjacobsen Ekspert
25. november 2003 - 12:08 #8
while (true) {
Avatar billede arne_v Ekspert
25. november 2003 - 12:11 #9
boolean continue = true;
while(continue) {
    Iterator it = lst.iterator();
    while(it.hasNext()) {
        X x = (X)it.next();
        // process x
    }
}

hvis continue bliver sat til false, så vil den køre en iteration færdig men
så ikke starte forfra igen men afslutte.
Avatar billede jakoba Nybegynder
25. november 2003 - 12:17 #10
Lidt farlig hvis der kan være situationer hvor listen er tom, så bliver det en endeløs busy loop.
Avatar billede arne_v Ekspert
25. november 2003 - 12:21 #11
Hvis ikke "process x" laver IO, sleeper eller på anden måde yielder, så
er det ikke bedre hvis der er data.
Avatar billede mmp Nybegynder
25. november 2003 - 12:39 #12
Ja, men loopet foregår inde i en tråd, som laver nogle andre ting og skal bruge et nyt objekt fra listen, derfor vil iteratoren nå slut og aldrig kunne starte forfra igen, fordi tråden (TimerTask) lever ligeså længe, som programmet kører. Så spørgsmålet er om man kan lave et eller andet med modulus.... så der hele tiden bliver hentet noget alligevel a la ovenstående eksempel... ???
Avatar billede mmp Nybegynder
25. november 2003 - 12:40 #13
Der bliver ikke yieldet for klassen extender kun TimerTask, dvs ingen monitorer.
Avatar billede jakoba Nybegynder
25. november 2003 - 12:46 #14
noget a la:

boolean continue = true;
Iterator it = lst.iterator();
while(continue) {
    if (it.hasNext()) {
        X x = (X)it.next();
        // process x
    } else {
        dummyTaskThatYelds();
        it = lst.iterator();
    }
}
Avatar billede arne_v Ekspert
25. november 2003 - 12:51 #15
Er det ikke bare:

boolean continue = true;
while(continue) {
    Iterator it = lst.iterator();
    while(it.hasNext()) {
        X x = (X)it.next();
        // process x
    }
    dummyTaskThatYelds();
}

?
Avatar billede jakoba Nybegynder
25. november 2003 - 12:59 #16
noget nær detsamme. eneste forskel er opførsel når continue sættes false. Skal listen køres til ende før slut?
Avatar billede mmp Nybegynder
16. december 2003 - 13:27 #17
fik overtalt min gruppe til ikke at bruge iterator
Avatar billede jakoba Nybegynder
16. december 2003 - 13:49 #18
selv tak.
Avatar billede arne_v Ekspert
16. december 2003 - 18:53 #19
tsk tsk
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