Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Lavorare con gli iteratori

    Se avessi questo problema:

    codice:
    Dare un'implementazione della seguente interfaccia che rappresenta una lista doppiamente
    linkata in cui elementi sono dei valori interi (int).
    La lista possiede un metodo denominato elementsStartingWith(), che prende in input un
    valore intero compreso tra 1 e 9, e ritorna un iteratore di tutti e soli gli elementi nella lista
    la cui cifra pił significativa sia uguale a tale valore.
    Fornire anche un'implementazione della classe LNode.
    codice:
    public interface DLinkedList {
    public int size ();
    // ritorna il numero di nodi contenuti nella lista
    public LNode getHeader ();
    // ritorna l'header della lista
    public LNode getTrailer ();
    // ritorna il trailer della lista
    public LNode next (LNode x) throws IllegalArgumentException;
    // ritorna il nodo successivo a x
    public LNode prev (LNode x) throws IllegalArgumentException;
    // ritorna il nodo che precede x
    public void addAfter (LNode x, LNode y)
    throws IllegalArgumentException;
    // aggiunge un nuovo nodo y dopo il nodo x
    public void delete (int value) throws EmptyListException;
    // elimina dalla lista tutti gli elementi uguali a value
    public Iterator<Integer> elementsStartingWith (int value)
    throws EmptyListException;
    // ritorna un iteratore di tutti gli elementi la cui cifra pił
    significativa č uguale a value
    }
    Sto avendo un pņ di confusione con le calssi e i metodi.
    Per usare un iteratore, devo implementare io l'interfaccia Iterator? Altrimenti le mie classi non trovano il metodo iterator?

    Ho fatto questo:

    codice:
    import java.util.*;
    
    public interface DLinkedList extends Iterable{
    	
    public int size ();
    // ritorna il numero di nodi contenuti nella lista
    public LNode getHeader ();
    // ritorna l'header della lista
    public LNode getTrailer ();
    // ritorna il trailer della lista
    public LNode next (LNode x) throws IllegalArgumentException;
    // ritorna il nodo successivo a x
    public LNode prev (LNode x) throws IllegalArgumentException;
    // ritorna il nodo che precede x
    public void addAfter (LNode x, LNode y)
    throws IllegalArgumentException;
    // aggiunge un nuovo nodo y dopo il nodo x
    public void delete (int value) throws EmptyListException;
    // elimina dalla lista tutti gli elementi uguali a value
    public Iterator<Integer> elementsStartingWith (int value) throws EmptyListException;
    // ritorna un iteratore di tutti gli elementi la cui cifra pił
    //significativa č uguale a value
    }
    Ho pensato di farle estendere Iterable visto che la lista deve essere iterabile....sarą giusto?
    Se non importo la java.util mi dą errore. Poi:

    codice:
    public class LNode
    {
    	int element;
    	LNode next;
    	LNode prev;
    	
    	public LNode()
    	{
    		element=0;
    		next=null;
    		prev=null;
    	}
    	
    	public int getElement(){return element;}
    	
    	public LNode getNext(){return next;}
    	
    	public LNode getPrev(){return prev;}
    	
    	public void SetNext(LNode node){next=node;}
    	
    	public void SetPrev(LNode node){prev=node;}
    	
    	public void SetElement(int a){element=a;}
    	
    }
    Nessun problema.



    Ora devo implementarmi una classe che estende Iterator?

    codice:
    import java.util.*;
    
    public class ElementsIterator implements Iterator
    {
    	private DList list;
    	private LNode cursor;
    	
    	public ElementsIterator(DList list)
    	{
    		this.list=list;
    		cursor=(list.getSize()==0)? null : list.getHeader.getNext();
    	}
    	
    	public boolean hasNext(){return cursor!=null;}
    	
    	public LNode next() throws NoSuchElementException{
    		if(cursor==null)
    			throw new NoSuchElmentException("Nessun successivo");
    		LNode node=cursor;
    		
    		cursor=(cursor.getNext()==null) ?null : cursor.getNext();
    		
    		return node;
    	}
    }
    Solo che i metodi get non vengono trovati, e poi ho fatto la classe normale per la mia lista:

    codice:
    import java.util.Iterator;
    public class DList implements DLinkedList
    {
    	private int size;
    	
    	private LNode header;
    	
    	private LNode trailer;
    	
    	public DList()
    	{
    		header=trailer=null;
    		size=0;
    		header.SetNext(trailer);
    		trailer.SetPrev(header);
    		
    	}
    	
    
    	public int size(){return size;}
    	
    	public LNode getHeader(){ return header;}
    	
    	public LNode getTrailer(){return trailer;}
    	
    	public LNode next(LNode x) throws IllegalArgumentException
    	{
    		return x.getNext();
    	}
    	
    	public LNode prev(LNode x) throws IllegalArgumentException
    	{
    		return x.getPrev();
    	}
    	
    	public void addAfter (LNode x, LNode y) throws IllegalArgumentException
    	{
    		
    			LNode before=x.getPrev();
    			LNode after=x.getNext();
    			
    			before.SetNext(y);
    			after.SetPrev(y);
    			y.SetNext(after);
    			y.SetPrev(before);
    		
    		size++;
    	}
    	
    	public void delete (int value) throws EmptyListException
    	{
    		LNode n;
    		
    		for(n=header; n.getNext()!=trailer; n=n.getNext())
    		{
    			if(n.getElement()==value)
    			{
    			
    					LNode before=n.getPrev();
    					LNode after=n.getNext();
    				
    					before.SetNext(after);
    					after.SetPrev(before);
    					n.SetNext(null);
    					n.SetPrev(null);
    				
    				size--;
    			}
    		}
    	}
    	
    public Iterator<Integer> elementsStartingWith (int value) throws EmptyListException
    {
    	  DList list=new DList();
    	
    	LNode n;
    	
    		for(n=header; n.getNext()!=trailer; n=n.getNext())
    		{
    			int numero=n.getElement();
    			String cifra=Integer.toString(numero);
    			System.out.println(cifra);
    			String confronto=Integer.toString(value);
    		
    			if(cifra.substring(0,1).equals(confronto));
    			
    				list.add(n);
    				
    			
    			
    				n=n.getNext();
    			
    		}
    		       Iterator<Integer> it=new Iterator();
    			it=list;
    		
    		return it;
    		
    		// ritorna un iteratore di tutti gli elementi la cui cifra pił
    //significativa č uguale a value
    }
    
    public void add(LNode n)
    {
    	if(header==trailer)
    	{
    		header.SetNext(n);
    		trailer.SetPrev(n);
    		n.SetPrev(header);
    		n.SetNext(trailer);
    		size++;
    	}
    	else addAfter(trailer.getPrev(), n);
    
    }
    
    }
    Nelle ultime due ci sono cose da sistemare sul funzionamento ma il problema č che mi danno un pņ tutte problemi perchč non trovano i metodi delle altre, specialmente iterator non viene trovato.....
    Come funziona questo maledetto iteratore????????

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Lavorare con gli iteratori

    Originariamente inviato da Darčios89
    Per usare un iteratore, devo implementare io l'interfaccia Iterator? Altrimenti le mie classi non trovano il metodo iterator?

    codice:
    import java.util.*;
    
    public interface DLinkedList extends Iterable{
    Se la tua classe implementa java.lang.Iterable allora vuol dire che deve avere un metodo iterator() che restituisce un Iterator (con l'ovvio scopo di permettere di iterare sul tuo oggetto-collezione senza doverne conoscere la struttura interna).
    Chiaramente Iterator č una interfaccia e quindi devi restituire un oggetto che sarą di una tua classe che implementa Iterator.
    Tipicamente questa classe non la si mette pubblica o la si rende particolarmente accessibile. Al contrario la si tiene il pił possibile nascosta, ad esempio una inner class privata del tuo DLinkedList.
    Questo semplicemente perché l'unica cosa che interessa č ottenere da iterator() un oggetto che "sa" come iterare sul tuo oggetto-collezione. Chi l'ha creato, come, dove .... generalmente all'esterno non interessa.
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  3. #3
    Io ho questa interfaccia giusto?

    codice:
    import java.util.*;
    
    public interface DLinkedList extends Iterable{
    	
    public int size ();
    // ritorna il numero di nodi contenuti nella lista
    public LNode getHeader ();
    // ritorna l'header della lista
    public LNode getTrailer ();
    // ritorna il trailer della lista
    public LNode next (LNode x) throws IllegalArgumentException;
    // ritorna il nodo successivo a x
    public LNode prev (LNode x) throws IllegalArgumentException;
    // ritorna il nodo che precede x
    public void addAfter (LNode x, LNode y)
    throws IllegalArgumentException;
    // aggiunge un nuovo nodo y dopo il nodo x
    public void delete (int value) throws EmptyListException;
    // elimina dalla lista tutti gli elementi uguali a value
    public Iterator<Integer> elementsStartingWith (int value) throws EmptyListException;
    // ritorna un iteratore di tutti gli elementi la cui cifra pił
    //significativa č uguale a value
    }
    Che credo debba estende iterable perchč č la lista a dover essere iterata, e poi ho scritto questa, non so se č corretto:

    codice:
    import java.util.*;
    public class DList implements DLinkedList,Iterator
    {
    	private int size;
    	
    	private LNode header;
    	
    	private LNode trailer;
    	
    	private LNode cursor;
    	
    	private DList list;
    	
    	public DList()
    	{
    		header=trailer=null;
    		size=0;
    		header.SetNext(trailer);
    		trailer.SetPrev(header);
    		cursor=(list.size()==0) ? null : list.next(header);
    		
    	}
    	
    
    	
    	
    	public int size(){return size;}
    	
    	public LNode getHeader(){ return header;}
    	
    	public LNode getTrailer(){return trailer;}
    	
    	public LNode next(LNode x) throws IllegalArgumentException
    	{
    		return x.getNext();
    	}
    	
    	public boolean hasNext(){return (cursor!=null);}
    	
    	public Object next() throws NoSuchElementException
    	{
    		if(cursor==null)
    			throw new NoSuchElementException("Nessun elemento");
    		
    		Object ret=(Object)cursor.getElement();
    		
    		cursor=(cursor.getNext()==trailer)? null : list.next(cursor);
    		
    		return ret;
    	}
    	
    	public LNode prev(LNode x) throws IllegalArgumentException
    	{
    		return x.getPrev();
    	}
    	
    	public void addAfter (LNode x, LNode y) throws IllegalArgumentException
    	{
    		
    			LNode before=x.getPrev();
    			LNode after=x.getNext();
    			
    			before.SetNext(y);
    			after.SetPrev(y);
    			y.SetNext(after);
    			y.SetPrev(before);
    		
    		size++;
    	}
    	
    	public void delete (int value) throws EmptyListException
    	{
    		LNode n;
    		
    		for(n=header; n.getNext()!=trailer; n=n.getNext())
    		{
    			if(n.getElement()==value)
    			{
    			
    					LNode before=n.getPrev();
    					LNode after=n.getNext();
    				
    					before.SetNext(after);
    					after.SetPrev(before);
    					n.SetNext(null);
    					n.SetPrev(null);
    				
    				size--;
    			}
    		}
    	}
    	
    public Iterator<Integer> elementsStartingWith(int value) throws EmptyListException
    {
    	  DList list=new DList();
    	
    	LNode n;
    	
    		for(n=header; n.getNext()!=trailer; n=n.getNext())
    		{
    			int numero=n.getElement();
    			String cifra=Integer.toString(numero);
    			System.out.println(cifra);
    			String confronto=Integer.toString(value);
    		
    			if(cifra.substring(0,1).equals(confronto));
    			
    				list.add(n);
    				
    			
    			
    				n=n.getNext();
    			
    		}
    		
    		// ritorna un iteratore di tutti gli elementi la cui cifra pił
    //significativa č uguale a value
    }
    
    public void add(LNode n)
    {
    	if(header==trailer)
    	{
    		header.SetNext(n);
    		trailer.SetPrev(n);
    		n.SetPrev(header);
    		n.SetNext(trailer);
    		size++;
    	}
    	else addAfter(trailer.getPrev(), n);
    
    }
    
    }
    Che implementa di per sč i metodi dell'interfaccia precedente, e siccome estende anche Iterator implementa i metodi di quell'interfaccia.
    Perņ compilando mi dice sempre che non trova il metodo iterator() dell'interfaccia Iterator.
    Ma se nella mia interfaccia il metodo che itera si chiama:

    codice:
    public Iterator<Integer> elementsStartingWith(int value) throws EmptyListException
    {
    Che ci posso fare????

    O devo utilizzare un' altra classe per implementare Iterator dove nuovamente riscrivo i riferimenti a header e trailer?

    Sono confuso su come si usa sinceramente...che cosa complicata... :master:

  4. #4
    Ho cambiato un pņ le cose, ho creato un'apposita classe che implementa Iterator:

    codice:
    import java.util.Iterator;
    
    public class ElementsIterator implements Iterator
    {
    	private DList list;
    	private LNode cursor;
    	
    	public ElementsIterator(DList list)
    	{
    		this.list=list;
    		cursor=(list.size()==0)? null : list.getHeader().getNext();
    	}
    	
    	public boolean hasNext(){return cursor!=null;}
    	
    	public Integer next() throws NoSuchElementException{
    		if(cursor==null)
    			throw new NoSuchElementException("Nessun successivo");
    		LNode node=cursor;
    		Integer ret=cursor.getElement();
    		
    		cursor=(cursor.getNext()==null) ?null : cursor.getNext();
    		
    		return ret;
    	}
    	
    	public void remove() throws UnsupportedOperationException
    	{
    		throw new UnsupportedOperationException("Remove is not allowed");
    		
    	}
    	
    	public Iterator
    }
    E la classe iterabile con il metodo che itera č questa:

    codice:
    import java.util.Iterator;
    
    public class ElementsIterator implements Iterator
    {
    	private DList list;
    	private LNode cursor;
    	
    	public ElementsIterator(DList list)
    	{
    		this.list=list;
    		cursor=(list.size()==0)? null : list.getHeader().getNext();
    	}
    	
    	public boolean hasNext(){return cursor!=null;}
    	
    	public Integer next() throws NoSuchElementException{
    		if(cursor==null)
    			throw new NoSuchElementException("Nessun successivo");
    		LNode node=cursor;
    		Integer ret=cursor.getElement();
    		
    		cursor=(cursor.getNext()==null) ?null : cursor.getNext();
    		
    		return ret;
    	}
    	
    	public void remove() throws UnsupportedOperationException
    	{
    		throw new UnsupportedOperationException("Remove is not allowed");
    		
    	}
    	
    	public Iterator
    }
    Il metodo iterator č sbagliato, ma mi chiedevo dą errore per esempio ache per via del tipo?
    Io devo restituire praticamente un iteratore degli elementi che nella mia lista sono uguali al valore passato come parametro al metodo e ho pensato di inserire questi nodi in un'altra lista su cui iterare.
    Forse č per questo?
    Perchč dovrebbe restituire un iteratore di tipo Integer e io invece pretendo di restituire una lista?

    Non saprei come fare, se non inserendo i valori in un' altra lista.

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.