Richiesta di aiuto per risolvere questo esercizio

di il
9 risposte

Richiesta di aiuto per risolvere questo esercizio

Salve .

Vorrei capire e risolvere questo esercizio .

Vorrei prima di tutto capire cosa fa il codice .
Capirlo con qualche semplice esempio .
Poi provare ad inserire le giuste istruzioni.
Per il momento ho capito soltanto che si tratta di una implementazione di oggetti in una lista .
Gli oggetti sono rappresentati come una array.
Ho capito che il costrutto public int size () trova la lunghezza dei singoli elementi .
Gli oggetti vengono richiamati dal costrutto public Object get( int index ) pero' poi mi perdo...

Spero possiate aiutarmi.


Mi viene proposto un codice che utilizza classi e interfacce.
L'esercizio consiste nel utilizzare e/o completare le seguenti classi e/o interfacce .

La classe ImmutableArrayList gestisce una lista di oggetti immutabili rappresentata come array di Object .
Di seguito e' rappresentata lo scheletro della classe .



public class ImmutableArrayList {
private Object [] elements ;
public ImmutableArrayList ( Object [] elements )
{
this . elements = elements ;
}

public Object get( int index ) {
return this . elements [ index ];
}

public int size () {
return this.elements.length ;
}
public Iterator iterator () { /* da completare */}
}
____________________________________________________________
Bisogna completare il metodo iterator() di modo da fargli restituire un oggetto che implementi
l'interfaccia Iterator adatta ad enumerare gli elementi di una ImmutableArrayList.

Iterator: interfaccia al centro del Design Pattern \Iterator"1.
Permette di enumerare gli elementi di una collezione:
______________________________________________________________

public interface Iterator
{
boolean hasNext ();
Object next ();
}
_________________________________________________________________
ImmutableArrayListIterator: implementazione di Iterator adatta ad enumerare gli elementi di
una ImmutableArrayList.
_________________________________________________________________
Da completare:

class ImmutableArrayListIterator implements Iterator
{
private ImmutableArrayList creatore ;

// aggiungere altre variabili di istanze e/o metodi se necessario ...

ImmutabileArrayListIterator ( ImmutableArrayList creatore ) {
this . creatore = creatore ;

// da completare e/o modificare se necessario
}
public boolean hasNext () { /* da completare */ }
public Object next () { /* da completare */ }
}

9 Risposte

  • Re: Richiesta di aiuto per risolvere questo esercizio

    FabioJ ha scritto:


    Vorrei capire e risolvere questo esercizio .

    Vorrei prima di tutto capire cosa fa il codice .
    La classe ImmutableArrayList "dovrebbe" rappresentare a livello concettuale una sequenza di oggetti indicizzata per indice, il tutto basato internamente su un array.
    I due metodi get e size sono banali: get espone l'oggetto i-esimo mentre size espone la lunghezza della sequenza (cioè dell'array).

    La classe dovrebbe rappresentare una sequenza "immutabile" .... in realtà non lo è al 100%. Il costruttore riceve un array dall'esterno e lo assegna direttamente al campo. Quindi l'array è lo stesso che ha il chiamante e il chiamante .... potrebbe modificarlo come gli pare .....
    Ma sorvoliamo su questo aspetto.

    FabioJ ha scritto:


    L'esercizio consiste nel utilizzare e/o completare le seguenti classi e/o interfacce .
    Ti viene chiesto di implementare l'iteratore.

    Generalmente la IMPLEMENTAZIONE (cioè la classe che fa implements Iterator) la si mette come inner-class interna alla collezione e oltretutto "privata", in modo che non sia visibile dall'esterno.
    L'oggetto iteratore nel tuo caso deve semplicemente tenersi l'indice a cui è arrivato. In base a quello, puoi esporre: dal hasNext se si può andare avanti e dal next il prossimo elemento.
  • Re: Richiesta di aiuto per risolvere questo esercizio

    Prima di tutto grazie per l'aiuto .


    In base alla risposta che mi hai dato :
    Per capirci ...

    Ti viene chiesto di implementare l'iteratore.

    Generalmente la IMPLEMENTAZIONE (cioè la classe che fa implements Iterator) la si mette come inner-class interna alla collezione e oltretutto "privata", in modo che non sia visibile dall'esterno.
    L'oggetto iteratore nel tuo caso deve semplicemente tenersi l'indice a cui è arrivato. In base a quello, puoi esporre: dal hasNext se si può andare avanti e dal next il prossimo elemento.


    Se non dico male La IMPLEMENTAZIONE vuol dire ereditare gli oggetti della classe public class ImmutableArrayList

    Per mantenere l'indice a cui e' arrivato , (come per esempio nel linguaggio C oppure C++) si utilizza una variabile e si eguaglia , per esempio
    indice=index
  • Re: Richiesta di aiuto per risolvere questo esercizio

    FabioJ ha scritto:


    Se non dico male La IMPLEMENTAZIONE vuol dire ereditare gli oggetti della classe public class ImmutableArrayList
    No, vuol dire realizzare una classe (distinta da ImmutableArrayList) che dichiara implements Iterator e in cui implementi concretamente i 2 metodi di Iterator.

    La interfaccia Iterator è sicuramente una che devi definire tu (o comunque ti è stata fornita/descritta come indicato). Non è di certo la java.util.Iterator del framework che invece è "generica" ed ha anche il remove.

    Poi la implementazione la puoi definire in vari modi: a) come anonymous inner-class direttamente dentro il iterator() di ImmutableArrayList; b) come inner-class "regolare" dentro ImmutableArrayList

    Ma nel tuo caso: c) la puoi anche definire come classe esterna a ImmutableArrayList. Generalmente la implementazione del Iterator è interna-nascosta nella collezione, perché deve avere un accesso molto "intimo" alla struttura dati della collezione. Nel tuo caso non c'è remove da implementare, non sono possibili modifiche strutturali alla lista e quindi non c'è davvero bisogno di chissà quale "intimità" con la struttura dati. Cioè detto in altro modo: l'iteratore può anche sfruttare dall'esterno i get/size della tua lista.

    FabioJ ha scritto:


    Per mantenere l'indice a cui e' arrivato , (come per esempio nel linguaggio C oppure C++) si utilizza una variabile e si eguaglia , per esempio
    indice=index
    No, semplicemente vuol dire che in ciascun oggetto iteratore che iterator() restituisce, ci dovrà essere un campo interno che tiene l'indice a cui è arrivata la iterazione. Questo lo usi in hasNext() e lo usi/aggiorni in next().
  • Re: Richiesta di aiuto per risolvere questo esercizio

    Public Iterator iterator () { /* da completare */} .......dovrebbe essere completata con un return a ImmutableArrayListIterator ???
  • Re: Richiesta di aiuto per risolvere questo esercizio

    FabioJ ha scritto:


    Public Iterator iterator () { /* da completare */} .......dovrebbe essere completata con un return a ImmutableArrayListIterator ???
    Sì, usando la ImmutableArrayListIterator che hai mostrato, nel iterator() dovrai istanziare ImmutableArrayListIterator e restituire quest'oggetto.
    A chi userà l'iteratore, NON importa dove/come/quale è la classe che IMPLEMENTA Iterator. Interessa solo che l'oggetto è-un Iterator.
  • Re: Richiesta di aiuto per risolvere questo esercizio

    Per istanziare si usa 'new' pertanto il comando diventa :

    return new ImmutableArrayListeIterator() pero' secondo me manca ancora qualcosa ...
  • Re: Richiesta di aiuto per risolvere questo esercizio

    FabioJ ha scritto:


    Per istanziare si usa 'new' pertanto il comando diventa :

    return new ImmutableArrayListeIterator()
    Sì, new, ovviamente.

    FabioJ ha scritto:


    Pero' secondo me manca ancora qualcosa ...
    Guarda il costruttore di ImmutabileArrayListIterator che hai mostrato prima.
  • Re: Richiesta di aiuto per risolvere questo esercizio

    Il costruttore e' questo:

    ImmutabileArrayListIterator ( ImmutableArrayList creatore ) {
    this . creatore = creatore ;

    percio' dovrebbe essere : return new ImmutableArrayListeIterator(this.creatore)....... o no?
  • Re: Richiesta di aiuto per risolvere questo esercizio

    FabioJ ha scritto:


    percio' dovrebbe essere : return new ImmutableArrayListeIterator(this.creatore)....... o no?
    No, solo this, perché fa già riferimento alla istanza su cui è stato invocato iterator()
Devi accedere o registrarti per scrivere nel forum
9 risposte