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

    Problema con Iterator

    Salve ragazzi,

    sto progettando un dato astratto coda. su questo dato coda dovrei applicare un iteratore che permette di scandire la coda dall'inizio alla fine.

    il problema è che l'iteratore non finisce mai va in loop infinito.

    codice:
    public class CodaCollegataT<T> implements CodaP<T> {
       private Record<T> inizio = null;
       private Record<T> fine =null;
    
       public void enqueue(T e) {
    	   if(isEmpty()){
    		   inizio = new Record<T>(e);
    		   fine = inizio;
    	   }
    	   else
    	   {
    		   fine.next = new Record<T>(e, fine);
    		   fine = fine.next;
    	   }
       }
    
       public boolean isEmpty() {
    	return inizio == null;
       }
       
      
    public Iterator<T> iterator() {
    	
    	return new CodaIteratore(inizio);
    }
       
       public static void main(String[] args)
       {
    	   CodaP<String> codap = new CodaCollegataT<String>();
    	   codap.enqueue("Ciccio spugna");
    	   codap.enqueue("MarlonBrandon");
    	   codap.enqueue("Brandon");
    	   codap.enqueue("Marlon");
    	   
    	
    	   Iterator it = codap.iterator();
    	   while(it.hasNext())
    	   {
    		   System.out.println(it.next());
    	   }
       }
    }
    interfaccia CodaP

    codice:
    package CodaP;
    public interface CodaP<T> extends Iterable<T> {
       public boolean isEmpty();
       public void enqueue(T e);
    }
    iteratore
    codice:
    package CodaP;
    
    import java.util.Iterator;
    
    public class CodaIteratore<T> implements Iterator<T>{
       
    //	CodaCollegataT<T> p;
        Record<T> inizio;
     //   Record<T> fine;
        
        CodaIteratore(/*CodaCollegataT<T>*/Record<T> p)
        {
        	this.inizio=p;
        //	inizio = fine = null;
        }
    	@Override
    	public boolean hasNext() {
    		// TODO Auto-generated method stub
    		if(inizio.next==null)
    			return false;
    		return true;
    	}
    
    	@Override
    	public T next() {
    		// TODO Auto-generated method stub
    		if(hasNext()){
    			Record<T> temp = inizio;
    			inizio = inizio.next;	
    			return (T)temp.elem;
    		   
    		}
    		return null;
    	}
    
    	@Override
    	public void remove() {
    		// TODO Auto-generated method stub
    		
    	}
    }
    quello che io ottengo è questo:

    Ciccio spugna
    MarlonBrandon
    Brandon
    Marlon
    Brandon
    Marlon
    Brandon
    Marlon

    praticamente all'iizio va bene poi mi stampa sempre gli ultimi due elementi

    come mai?????

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ho l'impressione che l'errore derivi dallo scrivere male tutto: la tua condizione hasnext() quando diventerà false? Se ci fai caso avrai sempre e comunque degli elementi, perché tu controlli solo la head, non la tail.

    Devi fermarti quando tail == next

  3. #3
    scusami ma cosa è tail???

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Allora scrivi bene l'iteratore mantenendo la logica scelta:
    usi head e tail (testa e coda) per l'inserimento? Mantienili quando fai il controllo, significa che il tuo iteratore punta ad un elemento della coda, se questo è uguale a tail allora sei alla fine e ti devi fermare.
    Se non usi tail, guarda il successivo dell'elemento corrente: se è null devi fermarti. Ma uniforma i controlli e il modo di scorrere la lista, altrimenti sei fregato

  5. #5
    ahahaha

    ascolta se hai notato io nella classe CodaColelgata ho due puntatori uno di inizio e uno di fine

    In pratica se li esporto entrabi... dovrei ottenere quello che voglio

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    appunto ho notato quello e appunto vedo anche che quando fai l'enqueue vedi se la coda è vuota bene inserisci, se non è vuota metti alla fine. e va bene, ma poi come fai a sapere se l'elemento ha il successivo? o l'elemento corrente = fine oppure fine.next = null.

    Ricorda anche che quando fai un inserimento, il successivo di fine è null (per consistenza).

  7. #7

    Re: Problema con Iterator

    Originariamente inviato da bircastri
    Salve ragazzi,

    sto progettando un dato astratto coda. su questo dato coda dovrei applicare un iteratore che permette di scandire la coda dall'inizio alla fine.

    interfaccia CodaP

    codice:
    package CodaP;
    public interface CodaP<T> extends Iterable<T> {
       public boolean isEmpty();
       public void enqueue(T e);
    }
    Il punto è che non hai definito bene il dato astratto. L'interfaccia del dato non è completa.
    Il discorso relativo all'iteratore è secondario.

  8. #8
    no no l'interfaccia è definita bene so che manca anche il metodo first, il metodo dequeue che cancella l'elemento.

    Vedi questa è una traccia di esame. Data così....

  9. #9
    Originariamente inviato da bircastri
    no no l'interfaccia è definita bene so che manca anche il metodo first, il metodo dequeue che cancella l'elemento.

    Vedi questa è una traccia di esame. Data così....
    Benissimo. Quindi si tratta di una coda write only.
    In questo caso scrivere l'apposito iteratore ha molto senso.

    L'errore sta in questa istruzione:
    codice:
    new Record<T>(e, fine);
    che viene eseguita nel momento in cui la coda non è vuota.

    Per quanto riguarda l'iteratore non ha per nulla senso chiamare hasNext in next.

  10. #10
    si chiamare hasnext in next ho capito che non serve a nulla

    mi spieghi il motivo per cui non va bene la prima istruzione che mi hai detto

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.