Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Problema lista

  1. #1

    Problema lista

    ciao ragazzi, nn ho mai programmato molto in java quindi magari è un errore banale...

    questo metodo deve creare una lista di tipo misurazione, senza avere parametri in ingresso... e poi svuotare il buffer da cui copia le misurazioni.... ecco il codice

    codice:
    	public synchronized List<Misurazione> leggi(){
    		
    		List<Misurazione> listaMisu = new ArrayList<Misurazione>();
    		
    		
    		for (position=0; position<maxCapacity; position++ ){
    			
    			listaMisu.add(position, simuBuffer[position]);
    			System.out.println(listaMisu.get(position).getType());
    			System.out.println(listaMisu.get(position).getValue());
    			System.out.println(listaMisu.get(position).getTimestamp());
    			simuBuffer[position].setType("");
    			simuBuffer[position].setValue("");
    			simuBuffer[position].setTimestamp(0);
    		}
    			
    		System.out.println ("secondo girooooo");
    	
    		
    		Iterator<Misurazione> iter = listaMisu.iterator(); 
    		
    		while(iter.hasNext()){
    			 Misurazione s=iter.next();
    		 	 System.out.println(s.getType());
    		 	 System.out.println(s.getValue());
    		 	 System.out.println(s.getTimestamp());
    		
    		}
    		
    		return listaMisu;
    		
    	}
    le stampe mi servivano per controllare dove sta il problema... infatti il primo giro mi stampa bene tutte le misurazioni ( il buffer viene riempito da un Thread di simulazione che genera valori casuali) mentre il secondo stampa solo due stringhe vuote e 0 ... dove sbaglio?
    Ultima modifica di MItaly; 09-09-2015 a 23:23 Motivo: Tag CODE

  2. #2
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ciao,
    il secondo stampa solo due stringhe vuote e 0
    dopo la prima stampa imposti i valori a zero e stringa vuota:
    codice:
        simuBuffer[position].setType("");
        simuBuffer[position].setValue("");
        simuBuffer[position].setTimestamp(0);
    Questo perchè nella lista non aggiungi un nuovo oggetto ma semplicemente gli passi il reference dell'oggetto nel buffer; quindi modificando il buffer modifichi anche la lista.
    Se ti serve poter modificare il buffer senza ripercussioni sulla lista allora puoi procedere in 2 modi:
    1) sovrascrivi il metodo clone() che restituisce un clone dell'oggetto (ogni oggetto lo eredita da object), e alla lista gli passi
    codice:
    listaMisu.add(position, simuBuffer[position].clone());
    2) crei semplicemente un nuovo oggetto con gli stessi valori e lo aggiungi alla lista:
    codice:
    listaMisu.add(position, new Misurazione(simuBuffer[position].getType(), simuBuffer[position].getValue(), simuBuffer[position].getTimestamp()));
    Tieni presente che il clone non è la scelta più raccomandata quindi ti consiglio di usare il secondo modo.

    Inoltre se vuoi svuotare il buffer devi assegnare null all'elemento dell'array che vuoi eliminare
    codice:
    simuBuffer[position] = null
    EDIT. Per semplificare il secondo metodo potresti aggiungere un nuovo costruttore che prende un oggetto della sua stessa classe e restituisce una nuova istanza:
    codice:
    public class Misurazione{
       ...    
       //costruttore standard 
       public Misurazione(int type, int value, int timestamp){
           // assegnazioni   
       }
       //costruttore per la copia
       public Misurazione(Misurazione m){
            this(m.getType(), m.getValue(), m.getTimestamp());
       }
    }
    e nella lista li inserisci cosi:
    codice:
    listaMisu.add(position, new Misurazione(simuBuffer[position]));
    Ultima modifica di Nikopol; 09-09-2015 a 23:25
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  3. #3

    Moderazione

    Aggiungo i tag [CODE] ... [/CODE] e sposto nella sezione Java.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Quote Originariamente inviata da Nikopol Visualizza il messaggio
    Ciao,

    dopo la prima stampa imposti i valori a zero e stringa vuota:
    codice:
        simuBuffer[position].setType("");
        simuBuffer[position].setValue("");
        simuBuffer[position].setTimestamp(0);
    Questo perchè nella lista non aggiungi un nuovo oggetto ma semplicemente gli passi il reference dell'oggetto nel buffer; quindi modificando il buffer modifichi anche la lista.
    Se ti serve poter modificare il buffer senza ripercussioni sulla lista allora puoi procedere in 2 modi:
    1) sovrascrivi il metodo clone() che restituisce un clone dell'oggetto (ogni oggetto lo eredita da object), e alla lista gli passi
    codice:
    listaMisu.add(position, simuBuffer[position].clone());
    2) crei semplicemente un nuovo oggetto con gli stessi valori e lo aggiungi alla lista:
    codice:
    listaMisu.add(position, new Misurazione(simuBuffer[position].getType(), simuBuffer[position].getValue(), simuBuffer[position].getTimestamp()));
    Tieni presente che il clone non è la scelta più raccomandata quindi ti consiglio di usare il secondo modo.

    Inoltre se vuoi svuotare il buffer devi assegnare null all'elemento dell'array che vuoi eliminare
    codice:
    simuBuffer[position] = null
    EDIT. Per semplificare il secondo metodo potresti aggiungere un nuovo costruttore che prende un oggetto della sua stessa classe e restituisce una nuova istanza:
    codice:
    public class Misurazione{
       ...    
       //costruttore standard 
       public Misurazione(int type, int value, int timestamp){
           // assegnazioni   
       }
       //costruttore per la copia
       public Misurazione(Misurazione m){
            this(m.getType(), m.getValue(), m.getTimestamp());
       }
    }
    e nella lista li inserisci cosi:
    codice:
    listaMisu.add(position, new Misurazione(simuBuffer[position]));

    grazie mille! nn programmo da molto e mi ero dimenticato questa cosa^^
    p.s. grazie per l'ultima idea anche! ma nn mi è concesso di modificare il codice di Misurazione purtroppo T_T

    p.p.s. se modifico l'array del buffer settando a null come dici tu, quando leggi agisce, che misurazione nuova crea con le celle null?
    Ultima modifica di powerbruce87; 10-09-2015 a 11:52

  5. #5
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Figurati
    Ma non ho capito molto bene che intendi qui
    p.p.s. se modifico l'array del buffer settando a null come dici tu, quando leggi agisce, che misurazione nuova crea con le celle null?
    Se ho capito bene quello che vuoi fare è leggere da un buffer tot misurazioni e per ogni misurazione letta devi copiarla in una lista e rimuoverla dal buffer per poterlo liberare, giusto?
    Se è così ti basta leggere una misurazione dal buffer, salvi una sua copia nella lista (come ti ho fatto vedere nel post precedente) e cancelli la misurazione dal buffer mettendola a null.
    Alla fine del ciclo avrai nella lista tutte le misurazioni che c'erano nel buffer e il buffer vuoto pronto per essere riempito nuovamente.

    PS. comunque dipende come rappresenti il buffer vuoto: è un array vuoto (di riferimenti null) oppure è un array pieno di misurazioni non valorizzate (stringhe vuote e 0)?
    Io ho dato per scontato che sia un array vuoto, scelta secondo me più appropriata, ma se invece lo rappresenti con misurazioni non valorizzate allora puoi benissimo impostare i campi a 0 e stinga vuota come facevi nel codice che hai postato all'inizio.
    Ultima modifica di Nikopol; 10-09-2015 a 14:44
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  6. #6
    Quote Originariamente inviata da Nikopol Visualizza il messaggio
    Figurati
    Ma non ho capito molto bene che intendi qui

    Se ho capito bene quello che vuoi fare è leggere da un buffer tot misurazioni e per ogni misurazione letta devi copiarla in una lista e rimuoverla dal buffer per poterlo liberare, giusto?
    Se è così ti basta leggere una misurazione dal buffer, salvi una sua copia nella lista (come ti ho fatto vedere nel post precedente) e cancelli la misurazione dal buffer mettendola a null.
    Alla fine del ciclo avrai nella lista tutte le misurazioni che c'erano nel buffer e il buffer vuoto pronto per essere riempito nuovamente.

    PS. comunque dipende come rappresenti il buffer vuoto: è un array vuoto (di riferimenti null) oppure è un array pieno di misurazioni non valorizzate (stringhe vuote e 0)?
    Io ho dato per scontato che sia un array vuoto, scelta secondo me più appropriata, ma se invece lo rappresenti con misurazioni non valorizzate allora puoi benissimo impostare i campi a 0 e stinga vuota come facevi nel codice che hai postato all'inizio.
    sì esatto hai cpaito beneXD ho optato per stringhe vuote e 0 per sicurezza, dato che il metodo leggi parte con una certa frequenza e volevo avere qlk da inserire nella lista per pgni elemento del buffer. se mettessi l'inizializzazione a null, il metodo leggi farebbe una lista lunga quanto gli elementi con valore assegnato oppure metterebbe a null un elemento della lista e proseguirebbe oltre?

  7. #7
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Arraylist permettere di inserire riferimenti null, quindi se leggi parte e il buffer è vuoto ti aggiunge tanti null quanti sono gli elementi del buffer.
    Ma se non è quello che vuoi ti basta controllora che un elemento del buffer non sia nullo prima di inserirlo nella lista:
    codice:
    for(...)
        if(buffer[position] != null){
             //copia l'elemento dal buffer alla lista
        }
    In questo modo ti inserisce solo i nuovi valori non nulli nella lista
    Ultima modifica di Nikopol; 10-09-2015 a 23:49
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  8. #8
    Quote Originariamente inviata da Nikopol Visualizza il messaggio
    Arraylist permettere di inserire riferimenti null, quindi se leggi parte e il buffer è vuoto ti aggiunge tanti null quanti sono gli elementi del buffer.
    Ma se non è quello che vuoi ti basta controllora che un elemento del buffer non sia nullo prima di inserirlo nella lista:
    codice:
    for(...)
        if(buffer[position] != null){
             //copia l'elemento dal buffer alla lista
        }
    In questo modo ti inserisce solo i nuovi valori non nulli nella lista

    ok grazie mille! adesso aspetto la risposta per l'altro thread che ho aperto così posso proseguire! gnetilissimoXD

  9. #9
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Figurati
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

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.