Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220

    [JAVA] Iterator e eccezioni

    ciao gente, dunque ho una classe contenente una LinkedList e il suo corrispondente Iterator, entrambi privati.
    io voglio scorrere la lista dall'esterno della classe, con un puntatore all'Iterator ritornato mediante un 'getQualcosa'.
    Mi solleva l'eccezione ConcurrentModificationException. non capisco perchè!! e è la stessa cosa se l'Iterator lo metto direttamente pubblico. boh

    praticamente mi va tutto bene fintanto che faccio il controllo HASNEXT, ma quando faccio NEXT mi si impianta...

    dico subito che per me è estremamente importante che l'Iterator sia memorizzato all'interno della classe, quindi non posso ogni volta (dall'esterno) fare qualcosa del tipo

    Iterator it=classe.getLista.iterator();

    grassie gente, rispondete numerosi!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    cosa vuoi fare di preciso??
    se vuoi andare avanti e indietro nella lista ti basta usare gli indici o i metodi messi a disposizione dalla struttura danti,senza l'iterator.
    se ti interessa prendere un valore elaborarlo e poi passare al successivo il tutto da una classe esterna penso sia un po complicato perche una volta partito l'iterator nn è che puoi metterlo in pausa...

  3. #3
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    http://java.sun.com/j2se/1.4.2/docs/...Exception.html
    For example, it is not generally permssible for one thread to modify a Collection while another thread is iterating over it
    succede ad esempio quando fai un add o un remove dalla lista durante un'iterazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    no non faccio add o remove, semplicemente devo estrarre il valore!

    questa è la classe che contiene la lista e l'iteratore

    Class C{
    private LinkedList lst;
    private Iterator it;

    public C{
    lst=new....
    it=lst.iterator();
    }

    blabla

    public getIterator(){
    return it;
    }
    }

    e poi dall'esterno:

    Iterator i=C.getIterator();

    while (it.hasNext()){
    ....it.next()
    }

    il problema è che finche faccio il controllo hasNext va tutto bene, poi al momento di fare next solleva l'eccezione!! ma quali sono i thread concorrenti alla lista? ce n'è uno solo!!! o no?

  5. #5

  6. #6
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    scusa ma che senso ha mettere un iterator come proprieta' di una classe, e fare un metodo che ritorna quell'iterator?

    io lascerei come proprieta' della classe solo la lista (linkedlist nel tuo caso), e farei un metodo getQualcosa() che la ritorna.

    nell'altra classe, prendi la lista usando il metodo C.getQualcosa(), e costruisci li' l'iteratore da utilizzare.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    dunque, sto facendo per il corso di algoritmi dell'università un progetto di risoluzione del sudoku. solo ke devo trovare TUTTE le soluzioni.

    quindi ho avuto questa idea: ogni casella della griglia contiene una LinkedList di tutti i possibili simboli candidati a occupare quella casella!

    poi, applicando la tecnica del backtracking (ricorsiva) devo adottare questo metodo:
    - prendo il primo candidato
    - se vedo che non fa conflitto con i simboli già scritti lo scrivo e passo alla casella successiva, altrimenti scrivo il secondo candidato nella casella corrente
    - se esaurisco tutti i candidati devo tornare alla casella precedente prendendo il candidato successivo a quello che avevo considerato la volta prima.

    è questo il problema: ogni volta che torno indietro devo ricordarmi l'ultimo candidato considerato, non devo ricominciare dall'inizio della lista!!! è per questo che volevo che l'Iterator fosse interno alla mia classe Casella!!
    solo che se ogni volta, dall'esterno faccio
    Iterator it=blablabla.iterator()
    questo mi si azzera...

  8. #8
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    non usare gli iterator... io non li ho mai sopportati e non capisco neanche perche' ci siano, mi sembrano dei "for" meno potenti :P

    se usi dei cicli costruiti con "for", puoi tenere traccia dell'indice dell'elemento della lista che sei arrivato a controllare, e ripartire da quello. Con l'iterator tutta la gestione degli indici e' nascosta, quindi non te la cavi piu' se non usando dei workaround assurdi che fanno perdere al codice sia chiarezza che prestazioni...

  9. #9
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Secondo me hai sbagliato l'approccio:

    tu dichiari un iterator privato dentro alla classe e lo tieni lì per usarlo quando ne hai bisogno? E se nel frattempo modifichi la lista? L'iterator non trova più gli elementi della lista dove si aspetta che siano e ti salta fuori la ConcurrentModificationException...

    Per conto mio:
    - dichiara la LinkedList come private (come hai già fatto)
    - NON dichiarare l'iterator
    - predisponi un metodo per portare la lista fuori dalla classe, quindi un getLista()
    - quando devi iterare sulla lista, fai Iterator i = classe.getLista().iterator
    ghinz

  10. #10
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Originariamente inviato da nether non capisco neanche perche' ci siano
    Un Iterator ti consente di iterare sulla lista e allo stesso tempo modificarne il contenuto mantenendo il "ciclo" consistente. Ad esempio puoi iterare sul contenuto ed eliminare elementi in base ad un tuo criterio. Con un ciclo for non potresti farlo perchè la dimensione della lista cambia e andresti "out of bound".
    ghinz

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 © 2025 vBulletin Solutions, Inc. All rights reserved.