Liste doppie GT: 6.2 (e 3.3) Doubly Linked Lists 1 Argomenti della lezione ADT Position NodeList interface Position PositionList class DNode NodePositionList inserzione rimozione Iteratore ADT Iterator ADT Iterable interface PositionList (2) class NodePositionList (2) class ElementIterator<E> Iteratore di Posizioni interface PositionList (3) class NodePositionList (3) liste in java.util 2 1 ADT e interfaccie GT 2 Astrazione nelle strutture dati Î Abstract Data Type (ADT) Abstract Data Type (ADT) modello matematico della struttura dati specifica tipi dei dati memorizzati operazioni supportate sui dati tipi dei parametri delle operazioni specifica cosa e non come in Java: interface (GT 2.4) lista di dichiarazioni di metodi Í cosa fa una classe implementa un’interfaccia Í come fa 3 Lista di Nodi ADT per Lista di Nodi Î NodeList posizione (nella lista) Î Position Motivazioni accedere direttamente ai nodi accedere in base alla posizione di un nodo, relativamente agli altri nodi Lista: collezione di elementi, che memorizza ciascun elemento in una posizione gli elementi sono organizzati con ordine lineare 4 2 ADT Position Metodo: element() ritorna l’elemento associato alla posizione N.B.: la posizione è sempre definita relativamente ai nodi vicini Esempi: mazzo di carte cursore in un text editor 5 ADT NodeList Metodi: first() ritorna la posizione del primo elemento last() ritorna la posizione dell’ultimo elemento prev(p) ritorna la posizione dell’elemento che precede p next(p) ritorna la posizione dell’elemento che segue p Errori: first() and last(): se lista vuota prev(p): se p è primo elemento next(p): se p è ultimo elemento N.B.: non c’è riferimento all’elemento si suppone che le posizioni siano valide 6 3 ADT NodeList (cont.) Metodi di aggiornamento: set(p,e) rimpiazza l’elemento alla posizione p con l’elemento e ritorna l’elemento che era in p addFirst(e) inserisce l’elemento e come primo elemento addLast(e) inserisce l’elemento e come ultimo elemento addBefore(p,e) inserisce l’elemento e prima della pos. p addAfter(p,e) inserisce l’elemento e dopo la pos. p remove(p) invalida la posizione p ritorna l’elemento che era in p 7 ADT NodeList (cont.) Errori se la posizione passata come argomento non è valida p == null p era stato cancellato p posizione di una lista diversa nei metodi prev(p): se p è prima posizione next(p): se p è ultima posiozione 8 4 Esempio 9 Interface Position 10 5 Interface PositionList 11 Interface PositionList (cont.) 12 6 Nodo Nodo: implementa Position per Lista di Nodi class DNode implements Postion<E> es.: Position<String> p = new DNode<String>(); p Position<String> p contiene riferimento ad oggetto di tipo DNode<String> prev next elem node oggetto di tipo DNode<String> class DNode (1/2) prev 13 next elem node 14 7 class DNode (2/2) prev next elem node 15 Lista doppia con sentinelle: class NodePositionList PositionList<String> p = new NodePositionList<String>(); riferimento ad oggetto di tipo PositionList<String> p numElts header 4 oggetto di tipo NodePositionList<String> trailer nodes/positions elements 16 8 class NodePositionList costruttore 1 2 numElts trailer 0 header header trailer 2 1 1 17 class NodePositionList: CheckPosition controlla se la Position p è valida 18 9 class NodePositionList: ... CheckPosition cast: da Position a DNode 19 class NodePositionList 20 10 Inserzione addBefore(p, X) p A B A B C p C newNode X p newNode A B X C 21 class NodePositionList (addBefore) newNode 2 A B p 1 X 3 v C 1 2 3 22 11 class NodePositionList (remove) p vPrev v vNext 23 Argomenti della lezione ADT Position NodeList interface Position PositionList class DNode NodePositionList inserzione rimozione Iteratore ADT Iterator ADT Iterable interface PositionList (2) class NodePositionList (2) class ElementIterator<E> Iteratore di Posizioni interface PositionList (3) class NodePositionList (3) liste in java.util 24 12 ADT Iterator per scandire una collezione, un elemento alla volta metodi boolean hasNest() controlla se ci sono ancora elementi inesplorati Object next() ritorna prossimo riferimento a prossimo elemento il metodo remove() in genere non si implementa 25 ADT Iterable per collezioni che possono essere scandite con Iterator metodo: iterator(): ritorna un Iterator sulla collezione esempio: seconda versione interfaccia PositionList 26 13 Esempio uso iteratore in PositionList nella classe NodePositionList Esempio uso per metodo toString() es.: fare con StringBuffer 27 Esempio classe iteratore per PositionList 28 14 Iteratore di posizioni (in PositionList) aggiunta del metodo positions() all’ interfaccia PositionList ritorna un oggetto Iterable con le posizioni terza versione interfaccia PositionList 29 Iteratore di posizioni (in PositionList) aggiunta del metodo positions() nella classe NodePositionList ritorna un oggetto Iterable con le posizioni 30 15 Costrutto Java 5 For-Each Loop GT: 6.3.2 Non aggiunge alcuna nuova funzionalità al linguaggio, è utile per semplificare la formulazione di cicli Sintassi : for ( Declaration : Expression ) Statement; Dichiarazione di una variabile; il tipo della variabile deve essere compatibile con il tipo degli oggetti della collezione/array su cui viene effettuata l’iterazione Espressione denota un array o un oggetto collezione di tipo Iterable Statement è l’istruzione semplice o composta che viene iterata, che costituisce il corpo del ciclo 31 Esempio con array String primi[] = new String[] { "2", "3", "5", "7" }; String txt= " "; Ciclo for normale for (int i = 0; i < primi.length; i ++ ) txt = txt + " " + primi[i]; Dichiarazione Espressione Ciclo For-Each su array for ( String str: primi ) txt = txt + " " + str; Statement 32 16 Esempio con oggetto collezione List<String> parole = new ArrayList<String>(); // inserimento dati in oggetto collezione “parole” parole.add("a1"); parole.add("b2"); parole.add("c3"); txt= " "; Ciclo con Iterator Iterator<String> it = parole.iterator(); while ( it.hasNext() ) { String str = it.next(); txt = txt + " " + str; } Ciclo For-Each for ( String str: parole ) { txt = txt + " " + str; } 33 6.3.4 java.util.LinkedList non ha concetto di posizione usa un cursore sulla lista: posizione tra due elementi Metodi di LinkedListIterator: add(e): aggiunge elemento e alla posizione del cursore hasNext(): hasPrevious(): previous(): ritorna l’elemento prec. e sposta indietro il cursore next(): ritorna l’elemento seguente e sposta avanti il cursore nextIndex(): ritorna l’indice dell’elemento precedente previousIndex(): ritorna l’indice dell’elemento seguente set(e): rimpiazza con e l’ultimo el. ritornato da next o previous remove(): rimuove l’ultimo el. ritornato da next o previous 34 17 6.3.4 problema iteratori multipli iteratori multipli su una stessa collezione se un iteratore modifica la collezione: Î sono guai!! Java.util: fail fast invalida tutti gli altri interfaccia java.util.List classi java.util.ArrayList java.util.LinkedList 35 6.4 Java Collections Framework in java.util Interfaccie Collection: estende Iterable Î ha metodo iterator() Iterator List: estende Collection, metodo listIterator() ListIterator: vedi slides prec. Map: mappa chiavi a valori Queue: coda con nomi suoi Set: insiemi classe java.util.LinkedList metodi ADT deque (GT 5.3) e ADT arrayList (GT 6.1) 36 18 6.4.3 ADT Sequence metodi ADT deque (GT 5.3), ADT arrayList (GT 6.1) e ADT node list (GT 6.2). + due metodi di conversione indice Ù posizione 37 Esercizi C- 6.6: come gestire il caso in cui la posizione p appartenga ad un’altra lista? sugg.: identificare a che collezione appartiene la posizione con variabile nell’oggetto Position metodo in collezione C- 6.15: come implementare iteratori fail fast, se la collezione viene modificata? sugg.: tenere contatore versione collezione 38 19