Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [ArrayList] Sclero...

    Ciao ragazzi,
    ho un problemone: sto scrivendo un parser di un file GPS (XML per la memorizzazione di waypoint su dispositivi GPS): devo scandire il file e memorizzare latitudine e longitudine di ogni waypoint.
    La logica è la seguente: scandisco il file alla riceca del tag "trkpst" che ha due attributi, lat e lon: memorizzo i due valori in un array di stringhe lungo due, e poi aggiungo questo array di stringhe un un arraylist.
    Il problema è che, quando stampo il contenuto dell'arraylist, mi stampa n volte (con n=size dell'arraylist) l'ultimo valore di lat e lon rilevato!!

    I pezzi di codice sono i seguenti:
    codice:
            ArrayList cont= new ArrayList();
    	 String[] record=new String[2]; //trkpt ha solo 2 attributi
             String[] rec=new String[2];
    
    if (elemento.toString().equals("trkpt")){
    			for(int i=0; i < attributi.getLength(); i++) {
    				record[i]=attributi.getValue(i).toString();
    								
    			}
    			
    			System.out.println("test "+ record[0].toString() +" " + record[1].toString());
    			cont.add(record);
    			System.out.println("finito di aggiungere");
    			
    			
    		}
    Sembbrerebbe funzionare perchè ogni volta che stampa la riga "test...." i valori di lat e lon sono corretti;

    codice:
    public void printAL(){
    		for (int i=0; i<cont.size();i++){
    			rec= (String[]) cont.get(i);
    			System.out.println("Lat: " + rec[0].toString() + " Long: " +rec[1].toString());
    		}
    		
    	}
    Questo è il pezzo che stampa n volte (con n=cont.size) le ultime lat e lon.


    Potete darmi una mano?

    Grazie

    Graziano

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Consiglio vivamente di prendere visione del Regolamento interno del forum, specialmente le parti che riguardano le norme da seguire quando si apre una discussione.

    1) Il titolo deve dare un'idea del contenuto (Sclero dice tutto tranne ciò che dovrebbe essere detto)

    2) Fra parentesi quadre va indicato il linguaggio o la tecnologia. Qui si parla di Java quindi va benissimo Java (ma si può specificare JSP, Servlet o anche semplicemente l'ambiente usato). ArrayList non è nulla di tutto ciò.

    3) Il codice va postato indentato e usando gli appositi tag CODE, come chiaramente illustrato all'interno del regolamento.

    Sistemo ove possibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Mi scuso con i MOD per il messaggio non conforme.
    Grazie per averlo sistemato, in futuro sarò più attento.

    Non sono ancora riuscito a risolvere il problema, ho provato anche a scandire l'arraylist con un iteratore, il risultato è il medesimo.
    Ho cambiato l'implementazione, non più array di strighe da mettere nell'arraylist, bensì arraylist di stringhe da mettere in un ulteriore arraylist.

    Non cambia nulla.

    Ci dev'essere qualcosa che mi sfugge.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    Re: [ArrayList] Sclero...

    Originariamente inviato da November17
    Ciao ragazzi,
    ho un problemone: sto scrivendo un parser di un file GPS (XML per la memorizzazione di waypoint su dispositivi GPS): devo scandire il file e memorizzare latitudine e longitudine di ogni waypoint.
    La logica è la seguente: scandisco il file alla riceca del tag "trkpst" che ha due attributi, lat e lon: memorizzo i due valori in un array di stringhe lungo due, e poi aggiungo questo array di stringhe un un arraylist.
    Il problema è che, quando stampo il contenuto dell'arraylist, mi stampa n volte (con n=size dell'arraylist) l'ultimo valore di lat e lon rilevato!!

    I pezzi di codice sono i seguenti:
    codice:
            ArrayList cont= new ArrayList();
    	 String[] record=new String[2]; //trkpt ha solo 2 attributi
             String[] rec=new String[2];
    
    if (elemento.toString().equals("trkpt")){
    			for(int i=0; i < attributi.getLength(); i++) {
    				record[i]=attributi.getValue(i).toString();
    								
    			}
    			
    			System.out.println("test "+ record[0].toString() +" " + record[1].toString());
    			cont.add(record);
    			System.out.println("finito di aggiungere");
    			
    			
    		}
    Sembbrerebbe funzionare perchè ogni volta che stampa la riga "test...." i valori di lat e lon sono corretti;

    codice:
    public void printAL(){
    		for (int i=0; i<cont.size();i++){
    			rec= (String[]) cont.get(i);
    			System.out.println("Lat: " + rec[0].toString() + " Long: " +rec[1].toString());
    		}
    		
    	}
    Questo è il pezzo che stampa n volte (con n=cont.size) le ultime lat e lon.


    Potete darmi una mano?

    Grazie

    Graziano
    Dal tuo codice / spiegazione non capisco le seguenti cose:
    1) cont è l'array che conterrà poi gli oggetti coordinate? (potresti fare una classe Punto che memorizza i dati e fare un ArrayList di Punto)

    2) dichiari cont, rec e record e poi fai un confronto per vedere se è il tag giusto. Se lo è cicli su record (un ciclo per due elementi, forse si potrebbe evitare se sai che sono sempre e solo due). Fai l'add a cont.
    Ma tutto questo sta in un altro ciclo for?
    al volante son nervoso

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Dal codice che hai postato si vede solo che viene aggiunto uno ed un solo array di stringhe all'ArrayList.

    Il ciclo for scorre sui campi dell'array (che devono obbligatoriamente essere al massimo 2), li valorizza quindi finisce. Subito dopo viene aggiunto l'array (uno solo!!) all'ArrayList.

    Se quel codice fa parte di un metodo che viene richiamato più volte allora è sbagliato: ogni volta che si entra in quel metodo l'arraylist viene ricreato (vedi istruzione new) e ci viene aggiunto sempre e solo 1 array di stringhe.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    @Rubox:

    1) esatto, l'idea è che "cont" sia un arraylist formato da un array per ogni punto, array con 2 elementi, lat e long; in realtà ogni array dovrebbe avere 4 elementi, anche la data e l'ora; per ora sto provando una versione più semplice.
    Potrei implementare una classe punto come suggerisci: farò così nel caso non risolvessi;

    2) corretto. Il tutto non sta in un ciclo for, ma è parte del metodo che parserizza il file gpx.
    L'if che ho postato, che controlla se l'elemento corrisponde al tag trkpt è parte del parser..è stato inserito subito dopo che il parser identifica il tag.


    @LeleFT

    Penso di aver risposto anche a te, le inizializzazioni sono fatte all'inizio della classe, mentre l'if è chiamato ogni volta che il parser incontra un tag nel file xml.

    Intanto grazie a entrambi

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Dunque, se dichiari cont da qualche parte, visibile da tutti metodi, e poi quel blocco if lo richiami ogni volta che devi aggiungere qualcosa, credo debba funzionare.
    al volante son nervoso

  8. #8
    Alla fine ho cambiato implementazione: ho usato ArrayListi di arraylist di punti, dove un punto è una classe definita da lat, long, data e ora. Su Arraylist abbastanza grossi (ma nemmeno tanto per l'applicaizone, gli algoritmi sono abbastanza lenti (un algoritmo che prende in ingresso un arraylist fatto come specificato prima e crea un arraylist per ogni giorno di rilevazione, su 7570 punti e 4 giorni, ci mette 60 secondi per elaborare.. non voglio immaginare quando ci saranno 150mila punti e 30 giorni....)

    L'importante è che adesso funzioni, grazie a tutti per il contributo!

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da November17
    Alla fine ho cambiato implementazione: ho usato ArrayListi di arraylist di punti, dove un punto è una classe definita da lat, long, data e ora. Su Arraylist abbastanza grossi (ma nemmeno tanto per l'applicaizone, gli algoritmi sono abbastanza lenti (un algoritmo che prende in ingresso un arraylist fatto come specificato prima e crea un arraylist per ogni giorno di rilevazione, su 7570 punti e 4 giorni, ci mette 60 secondi per elaborare.. non voglio immaginare quando ci saranno 150mila punti e 30 giorni....)

    L'importante è che adesso funzioni, grazie a tutti per il contributo!
    Non saprei dirti se con un altro linguaggio di programmazione andresti più veloce, ma non credo.
    Dovresti ottimizzare il tuo codice per evitare qualunque operazione "inutile" o comunque superflua.
    Io avevo questo problema: leggere da seriale dei valori, ora e data di acquisizione. Ogni punto memorizzato in un oggetto Punto. Poi sul Vector (di 10'000 valori e più) fare delle "estrapolazioni matematiche", minimi locali, massimi locali, farne una quantizzazione.
    Ma su 10'000 valori non impiegava che un qualche secondo.

    Ottimizza il codice e togli tutto quello che non è utile. E se quando calcoli, puoi far fare altro all'applicazione, potresti fare le operazioni lunghe e complesse in un Thread separato, e andare avanti a fare altre cose.
    al volante son nervoso

  10. #10
    Il problema è il metodo che splitta l'arraylist di punto in tanty arraylist quanti sono i giorni memorizzati nell'arraylist grande; mi serve così perchè devo fare una analisi giornaliera dei dati.

    L'algoritmo è poco efficiente, perchè ci sono due for annidati; quello esterno che cicla tante volte quanti sono le date rilevate nell'arraylist (da un metodo apposito), mentre il for interno cicla su tutto l'arraylist grande e cerca gli elementi con la data= a quella impostata dal ciclo esterno, e li memorizza in un arraylist parziale.

    Non vedo altri modi per implementare lo split dell'arraylist..forse ordinando l'arraylist e implementando qualcosa simil-ricerca binaria... per ora lo tengo così,punto prima a costruire un qualcosa di funzionante, poi penso alle ottimizzazioni... fermo restando la validissima idea del thread a parte!

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.