Newsgroup: it.comp.java
Titolo: Concurrent modification in un ciclo

Ciao a tutti,
Sto cercando di risolvere un problema su cui sono bloccato. Sono un
neofita nel linguaggio Java. Sto cercando di sviluppare un web spider
usando le librerie di jericho. Le mie classi prendono un url, si
connettono ad esso, prendono tutti i link unici presenti nella pagina
html in una hashtable come chiavi, poi prendono tutte le singole
parole della pagina e le mettono (in un altra hash) come valore per
ciascuna chiave. Quello che mi serve è un sistema recursivo che faccia
un ciclo attraverso la hashtable e aggiunga i nuovi link trovati nella
hashtable in modo tale che il ciclo si renda conto di queste aggiunte
e prosegua fino a quando non ha parsato tutti i link in essa
contenuti.
Questo è un esempio di quello che in linea di massima mi servirebbe:
public class Parse {
public static Hashtable linksList = new Hashtable();
public static String url = "
http://myaddress.com
"
   public static doParse() {
     linksList.put(url,new Hashtable());
 
      //ciclo generico per riempire la hashtable
      for (Enumeration en = linksList.keys(); en.hasMoreElements(); )
{
   	String urlToParse = en.nextElement();
	parse(htmlText);
      }
   }
   public static parse(String url) {
        String htmlText = Connection.getString(url); //prende l'html
di un dato url
        Hashtable words = getWords(htmlText); //prende tutte le parole
di un dato testo html
        linksList.put(url, words);
        for (... tutti i link di un dato testo html) {
             String newUrl; //tutti i nuovi link trovati in un dato
testo html
             linksList.put(newUrl, new Hashtable());
        }
   }
}
Come vedete il metodo parse aggiunge recursivamente nuovi elementi
dell'hashtable per ogni url nuovo che trova.
Il ciclo generico (quello primario) dovrebbe accorgersi di questi
cambiamenti e andare avanti fino a quando
il metodo parse non aggiunge più nessun link. 
Questo mi permetterebbe di riempire l'hashtable con un url e le parole
in esso contenute per tutte le pagine di un
particolare sito. Quindi, quando la mia ht sarà completamente
riempita, la aggiungerò ad un database in modo tale
da salvare tutti i dati recuperati facendo un unica connessione al db
Come posso farlo? Ho fatto una prova e ho visto che l'ht non si
accorge dei cambiamenti fatti all'interno del ciclo.
Quale altro oggetto potrei usare? Qualche altra idea su come fare? Ho
provato a cercare su Internet ma ho trovato 
solamente soluzioni per evitare le concurrentModificationException con
gli ArrayList,  non esempi di codici su come
gestire un problema simile al mio.
Spero davvero che possiate aiutarmi perchè sono bloccato su questo
problema e non so davvero come risolverlo
Grazie a tutti in anticipo e Buon Ferragosto!!
Ciao!
mario

Quello che dovresti fare è di implementare una sorta di push e pop.
Push degli indirizzi in uno stack
Pop degli indirizzi visitati.
Il ciclo continua finché lo stack si svuota.
Inventati un modo di fare l'operazione di "pop" tenendo conto di non
visitare lo stesso URL due volte. Un'idea sarebbe di avere una hash da
gestire come "stack" ed un'altra hash da gestire come "deposito" di URL
visitati.
Base: il primo URL viene inserito nello stack e nel deposito
Passo: visito l'URL, prendo tutti i nuovi HREF e li metto nello stack
("push") se e solo se non sono già presenti nel deposito, faccio il "pop"
dell'URL e ripeto, finché (!stack.isEmpty())
Alex.
-- 
___________________________________________________________
a p bertolini
(Tribù Digitale Blackmambo: 
www.blackmambo.it
)

15/8/2004 12:45, it.comp.java; mario ha scritto tante cose.
Il fatto è che l'algoritmo stesso non è ancora corretto.
In parse() dovrebbe asserci almeno una "if (!linksList.containsKey(url))"
prima della connection, e almeno una chiamata ricorsiva al posto
dell'ultima put; e comunque poi ci sono altri problemi...
-- 
Njc