Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Spiegazione su Iterator

    ciao a tutti, mi sono trovato a combattere con un Iterator..e ne sono uscito perdente..
    il problema è questo:

    codice:
    int riconosciFrase(Iterator<String> frase)throws IOException{
    		int count=0;
    		String parola;
    		while(frase.hasNext()){
    			parola=frase.next();
    			if(cercaParola(parola)){
    				count++;
    			}
    		}
    		return count;
    	}
    quello che mi chiedo è..come faccio a passare al metodo cercaParola anche la prima parola della frase?!?
    perchè facendo così come ha scritto il prof la String parola=frase.next() [che se non ho capito male dovrebbe essere la seconda parola] e la prima?!
    sicuramente non ho capito il metodo hasNext() e il metodo next() perchè ho delle incongruenze tra quello che ci ha spiegato il prof e quello che c'è scritto nel javadoc. da quello che pensavo di aver capito a lezione, hasNext() ritorna true se dopo l'elemento a cui punta Iterator c'è un altro elemento, e invece next() assegna il valore a cui punta l'Iterator e DOPO passa al successivo. invece nel javadoc, da quello che ho capito, hasNext() è giusto quello che ho capito, mentre next() returna l'elemento successivo a quello cui punta iterator. mi potete dire quale delle due è giusta.
    mi ci sto impiccando. perchè se è giusta quella del prof, secondo me, invece della prima parola il metodo cercaParola non viene invocato sull'ultima. che ne pensate? grazie in anticipo per la pazienza!

  2. #2
    Non ho ben capito la tua perplessità ma, se non sbaglio, la prima parola dovrebbe uscire fuori già con il primo next.
    "Na' sedia te vojo tirà!"

  3. #3
    praticamente non ho capito se quando assegno parola=frase.next(), visto che iterator punta alle prima parola quando è invocato, alla stringa parola gli viene assegnata la prima parola e dopo itarator di sposta sulla seconda della frase, oppure se alla stringa parola gli viene assegnata direttamente la seconda parola. perchè nel primo caso avrei che l'ultima parola della frase non viene processata, nel secondo caso invece, che la prima parola non viene processata.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Spiegazione su Iterator

    Originariamente inviato da eddy_91
    ciao a tutti, mi sono trovato a combattere con un Iterator..e ne sono uscito perdente..
    il problema è questo:

    codice:
    int riconosciFrase(Iterator<String> frase)throws IOException{
    		int count=0;
    		String parola;
    		while(frase.hasNext()){
    			parola=frase.next();
    			if(cercaParola(parola)){
    				count++;
    			}
    		}
    		return count;
    	}
    quello che mi chiedo è..come faccio a passare al metodo cercaParola anche la prima parola della frase?!?
    perchè facendo così come ha scritto il prof la String parola=frase.next() [che se non ho capito male dovrebbe essere la seconda parola] e la prima?!
    sicuramente non ho capito il metodo hasNext() e il metodo next() perchè ho delle incongruenze tra quello che ci ha spiegato il prof e quello che c'è scritto nel javadoc. da quello che pensavo di aver capito a lezione, hasNext() ritorna true se dopo l'elemento a cui punta Iterator c'è un altro elemento, e invece next() assegna il valore a cui punta l'Iterator e DOPO passa al successivo. invece nel javadoc, da quello che ho capito, hasNext() è giusto quello che ho capito, mentre next() returna l'elemento successivo a quello cui punta iterator. mi potete dire quale delle due è giusta.
    mi ci sto impiccando. perchè se è giusta quella del prof, secondo me, invece della prima parola il metodo cercaParola non viene invocato sull'ultima. che ne pensate? grazie in anticipo per la pazienza!
    Il comportamento è quello che ci si aspetterebbe (parte dal primo elemento, compreso), e comunque basta fare una prova per accorgersene. Quindi il tuo problema è altrove, il primo elemento viene considerato.

    Comunque mi sembra un po' strano come metodo, nel 99% dei casi gli iteratori si ottengono da istanze dell'interfaccia Collection, che ti permette di iterare la collezione con un semplice for-each ed ottenere la dimensione col metodo size (con tutta probabilità in tempo costante).

    codice:
    int riconosciFrase(Collection<String> frase)
    {
    	for (String parola : frase)
    		cercaParola(parola);
    	
    	return frase.size();
    }

  5. #5
    è che non l'ho scritto io, ma il mio prof dell'università, e stavo cercando di capire il funzionamento dell'iterator. quindi se processa il primo elemento..come fa a processare anche l'ultimo?!?
    perchè secondo me, quando arriva alla penultima parola, la processa, e poi l'iterator passa all'ultima giusto?? però quando passa il while sull'ultima tramite hasNext() vede che non ha altri elementi dopo e quindi esce senza processare l'ultima. o sbaglio?! eppure se faccio un main di prova funziona tutta bene..non capisco..

  6. #6
    rivedendo gli appunti del prof c'è scritto:
    HasNext(): veri ca se esiste un elemento successore (in tal caso restituisce true) o se l'elemento corrente è l'ultimo della collezione (in tal caso restituisce false);
    quindi da questo, quando l'iterator arriva all'ultima parola hasNext() restituisce false e il while non viene eseguito, e quindi non dovrebbe processare l'ultima parola, cosa che invece fa..come è possibile tutto ciò?!?

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da eddy_91
    è che non l'ho scritto io, ma il mio prof dell'università, e stavo cercando di capire il funzionamento dell'iterator. quindi se processa il primo elemento..come fa a processare anche l'ultimo?!?
    perchè secondo me, quando arriva alla penultima parola, la processa, e poi l'iterator passa all'ultima giusto?? però quando passa il while sull'ultima tramite hasNext() vede che non ha altri elementi dopo e quindi esce senza processare l'ultima. o sbaglio?! eppure se faccio un main di prova funziona tutta bene..non capisco..
    No, se non ti è stato ancora restituito l'ultimo elemento con next, hasNext continua a restituire true. Quindi dopo che l'iteratore ti restituisce il penultimo elemento, hasNext continua a restituire true, nel momento in cui invochi ancora next ti viene dato l'ultimo elemento e da quel momento in poi, hasNext restituisce false.

    E' scritto chiaramente nella documentazione del metodo hasNext:

    "Returns true if the iteration has more elements. (In other words, returns true if next() would return an element rather than throwing an exception.)"

    ... che è ciò che ci si aspetterebbe logicamente.

  8. #8

    Re: Spiegazione su Iterator

    appunto, se guardi il codice, prima dà alla string parola=frase.next() e poi la processa, quindi quando arriva alla penultima, il while passa, alla string parola viene assegnata la penultima parola, l'iterator di sposta sull'ultima e viene processata la penultima, poi quando si rifà il while hasNext() dovrebbe dare false, perchè iterator è passato all'ultima e quindi non la dovrebbe processare, o sbaglio?! e invece lo fa..XD

    codice:
    int riconosciFrase(Iterator<String> frase)throws IOException{
    		int count=0;
    		String parola;
    		while(frase.hasNext()){
    			parola=frase.next();
    			if(cercaParola(parola)){
    				count++;
    			}
    		}
    		return count;
    	}

  9. #9
    praticamente se non ho capito male dovrei pensare come se al primo ciclo di while, prima che io stabilisca String parola=frase.next() l'Iterator si trova in questa posizione (cioè che punta prima dell'inizio della lista):
    codice:
    List:         [1] [2] [3] [4] [5]
               ^
               |
    Iterator: [I]
    così poi facendo i vari next arriva all'ultimo, lo processa, e poi interrompe il ciclo poichè hasNext() dell'ultimo elemento ritorna false. lo so che è un ragionamento contorto e sicuramente sbagliato..

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Se proprio vuoi vederla così:
    • all'inizio l'iteratore è "posizionato" sul primo elemento;
    • quando invochi next, l'iteratore ti restituisce l'elemento su cui si trova, dopodiché si posiziona sul successivo;
    • l'invocazione di hasNext restituisce true solo DOPO che un'invocazione di next ha restituito l'ultimo elemento, insomma quando l'iteratore è "uscito" dalla collezione.

    Più semplice di così non so come dirlo, francamente non capisco i tuoi dubbi, funziona tutto esattamente com'è logico aspettarsi: finché hasNext restituisce true, continua ad invocare next e riceverai tutti gli elementi della collezione, ovviamente compreso il primo.
    E ripeto, quando puoi usa il for-each, che Iterable e Iterator servono anche a quello.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.