Pages: [1]   Go Down
Print
Author Topic: esercizio 6.1 iteratori specializzati  (Read 1831 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
zeridos89
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 127


Diego Sinitò


« on: 22-06-2010, 10:51:47 »

salve a tutti, ragazzi volevo un chiarimento per quanto riguarda gli iteratori..

"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.
Tempo di risoluzione: 2 ore"

adesso io mi trovo con una DList di interi e dovrei creare questo iteratore, la mia domanda è la seguente l'iteratore è a sua volta una LinkedList con i metodi hasNext() e next() ?
se cosi fosse per ogni intero che inizia con il valore VALUE dovrei creare un nuovo nodo nella lista dell'iteratore?

grazie in anticipo
Logged
zeridos89
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 127


Diego Sinitò


« Reply #1 on: 23-06-2010, 11:04:35 »

Code:
public class Iterator<T> {
private DLinkedList l;
private LNode cursor;

public Iterator(){
l=new DLinkedList();
cursor=l.getHeader();
}
public void add(LNode n){
l.addAfter(l.getTrailer().getPrev(), n);
}
public int next(){
if(cursor==l.getHeader())
cursor=l.next(cursor);
int val=cursor.getElement();
cursor=l.next(cursor);
return val;
}
public boolean hasNext(){
if(cursor.getNext()!=l.getTrailer())
return true;
return false;
}
}
yoh implementato in questo modo è corretto?
Logged
zeridos89
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 127


Diego Sinitò


« Reply #2 on: 23-06-2010, 23:13:56 »

dai ragazzi!!!  testate  testate
Logged
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #3 on: 30-06-2010, 11:00:09 »

Che io sappia l'iteratore non è un'ulteriore lista, ma un oggetto che scorre sulla tua lista che implementa appunto Iterator e così i metodi next(), hasNext() e remove(). infatti al costruttore passi la lista su cui vuoi iterare e hai un cursore k è come un puntatore. Io l'ho strutturato in modo diverso l'esercizio utilizzando anche l'interfaccia Position e PositionList...non so quale sia l'idea giusta questo punto
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #4 on: 01-07-2010, 12:06:33 »

Allora...sono riuscita ad implementare la mia classe che implementa DLinkedList che è iterabile e tutto il resto solo che...non riesco nel fare il metodo elementStartingwhit() non è che qualcuno ha messo mano a qst'esercizio?? mi manca solo quello... grazie!
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #5 on: 01-07-2010, 19:13:47 »

adesso io mi trovo con una DList di interi e dovrei creare questo iteratore, la mia domanda è la seguente l'iteratore è a sua volta una LinkedList con i metodi hasNext() e next() ?
No l'iteratore è un oggetto che serve per scorrere gli elementi della lista.
E' vero che all'interno dell'iteratore ci vuole un riferimento all'oggetto DList (per poter accedere ai suoi elementi) ma di per sè l'iteratore non è una lista.
In generale un iteratore ha al suo interno i seguenti campi:
  • Riferimento alla classe sulla quale iterare
  • "Cursore", una variabile che indica in qualche modo la posizione corrente dell'iteratore. (Per un array potrebbe essere un intero, mentre nel tuo caso dovrebbe essere un oggetto DNode)

Allora...sono riuscita ad implementare la mia classe che implementa DLinkedList che è iterabile e tutto il resto solo che...non riesco nel fare il metodo elementStartingwhit() non è che qualcuno ha messo mano a qst'esercizio?? mi manca solo quello... grazie!
Per implementare elementsStartingWith() devi creare al solito modo un iteratore.
L'unica particolarità sta nel metodo next(), che deve scorrere la lista finchè non trova un numero la cui cifra più significativa è uguale al parametro passato ad elementsStartingWith().
Una cosa del genere:
Code:
public class DList implements DLinkedList
{
    private DNode head;
    ....
    public Iterator<Integer> elementsStartingWith(int value) throws EmptyListException
    {
              if (size == 0) throw new EmptyListException("");
              // All'iteratore passo sia il riferimento alla classe che il valore della cifra più significativa
              return new ElementsStartingWithIterator(this, value);
    }
}

public class ElementsStartingWithIterator implements Iterator<Integer>
{
       private DList list;
       private DNode cursor;
       private int cifra;
       public ElementsStartingWithIterator(DList list, int cifra)
       {
            this.list = list;
            this.cifra = cifra;

            this.cursor = ...; // Nell'inizializzare cursor, devi scorrere gli elementi della lista finchè non ne trovi uno che inizia per "cifra" oppure finchè non li hai finiti tutti.
       }
        public boolean hasNext() { ... }
        public E next()
        {
                // Come per il costruttore, devi scorrere (da cursor in poi) gli elementi della lista  finchè non ne trovi uno che inizia per "cifra".
        }
}

Il problema è ridotto al determinare la cifra più significativa dato un intero (potresti creare un metodo d'appoggio all'interno di ElementsStartingWithIterator, del tipo public static boolean startsWith(int num, int cifra) { ... }
Per determinare la cifra più significativa potresti dividere per dieci il numero finchè il risultato non è minore di 10.
« Last Edit: 01-07-2010, 19:16:20 by XDnl » Logged
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #6 on: 02-07-2010, 08:32:40 »

Ho seguito il tuo ragionamento e ho modificato la mia classe ElementStartingWith ma ovviamente c'è qualcosa k nn va...
Code:
public class ElementStartingWith implements Iterator<Integer> {

DoubleLinkedList list;
LNode cursor;
int cifra;

public ElementStartingWith(DoubleLinkedList l, int val){
this.list=l;
this.cifra=val;
this.cursor=list.getHeader();
boolean trova=false;
while(cursor!=list.getTrailer() && !trova){
if (cursor.element()==cifra) trova=true;
cursor=list.next(cursor);
}
}
public boolean hasNext() {
return (cursor!=null);
}
public Integer next() throws NoElementException {
if (cursor==null) throw new NoElementException("Non c'è alcun elemento successivo");
Integer i=-1;
if(startsWith(cursor.element(), cifra)==true) i=cursor.element();
if(cursor==list.getTrailer()) cursor=null;
else cursor=list.next(cursor);
return i;
}
scusami ma ancora non riesco...
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #7 on: 02-07-2010, 16:21:39 »

(vedi i commenti al codice)

Code:
public class ElementStartingWith implements Iterator<Integer>
{
DoubleLinkedList list;
LNode cursor;
int cifra;

public ElementStartingWith(DoubleLinkedList l, int val)
{
this.list=l;
this.cifra=val;
this.cursor = list.getHeader();
               cursor = list.next(cursor); // Devi iniziare dal primo elemento

boolean trova = false;
while (cursor != list.getTrailer() && !trova)
                {
                        // Il test non è corretto. Bisogna iterare sui numeri che iniziano per "cifra" mentre qui controlli
                        // che i numeri siano uguali a cifra.
                        // Oltre a questo, una volta impostato trova a true, viene comunque eseguita la riga di codice
                        // successiva, invalidando di fatto il cursore (cioè si trova alla posizione errata).
// if (cursor.element() == cifra) trova = true;
// cursor = list.next(cursor);

                        if (startsWith(cursor.element(), cifra)) trova = true;
                        else
                            cursor = list.next(cursor);
}
}

public boolean hasNext()
        {
                // Visto che nella lista utilizzi le sentinelle header e trailer, la lista finisce non appena incontri trailer!
// return (cursor!=null);
                return cursor != list.getTrailer();
}

        // Il next non lancia eccezioni! Esso viene richiamato se e solo se la routine hasNext() dà TRUE in uscita.
        // Il compito di next è tornare l'elemento puntato ATTUALMENTE da cursor e POI spostare cursor al prossimo
        // elemento che inizi per cifra. Se questo elemento non c'è allora si ha cursor == list.getTrailer()
public Integer next()
        {
// if (cursor==null) throw new NoElementException("Non c'è alcun elemento successivo");

                // Il test così non va.
/* Integer i = -1;
if(startsWith(cursor.element(), cifra)==true) i=cursor.element();
if(cursor==list.getTrailer()) cursor=null;
else cursor=list.next(cursor);
return i;*/
              
                // Quello che bisogna fare è:
                // 1) Memorizzarsi in una variabile temporanea il valore del cursore.
                Integer i = cursor.element();
                // 2) Spostare il cursore al prossimo elemento CHE RISPETTI IL VINCOLO della prima cifra
                //     (il tuo codice non è corretto perchè semplicemente ti sposti al succesivo, senza controllare che
                //         effettivamente inizi per cifra).
                do
                {
                     cursor = list.next(cursor);
                } while (cursor != list.getTrailer() && !startsWith(cursor.element(), cifra));

                // Torno l'elemento precedentemente puntato da cursor  
                return i;
}
Assumendo che startsWith() sia stata implementata correttamente, l'iteratore dovrebbe funzionare.
Un'altra cosa: poichè la classe DLinkedList non implementa Iterable<E>, non è possibile usare il ciclo foreach per iterare.
Nel main devi scrivere una cosa del genere:
Code:
DLinkedList myList = new DLinkedList(...);
for (Iterator<Integer> it = myList.elementsStartingWith(); it.hasNext(); )
{
       Integer num = it.next();
       // Codice...
}
« Last Edit: 02-07-2010, 16:26:38 by XDnl » Logged
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #8 on: 02-07-2010, 17:22:34 »

Ora si che funziona! grazie mille, scusa sn imbranata ancora... sn riuscita anche ad implementare il delete che ancora non avevo fatto che non riuscivo. gentilissimo
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
vincenzo86
Forumista
***
Offline Offline

Gender: Male
Posts: 505



« Reply #9 on: 20-10-2010, 17:09:08 »

Scusate ma in questo esercizio, bisogna utilizzare la classe NodePositionList per la lista doppiamente linkata? Grazie.
Logged
Pages: [1]   Go Up
Print
Jump to: