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????????