Liste doppie - DEIdepoli/fi2ae/slides_pw/...modello matematico della struttura dati specifica tipi...
Transcript of Liste doppie - DEIdepoli/fi2ae/slides_pw/...modello matematico della struttura dati specifica tipi...
1
1
Liste doppie
GT: 6.2 (e 3.3)Doubly Linked Lists
2
Argomenti della lezione
ADT PositionNodeList
interfacePositionPositionList
classDNodeNodePositionList
inserzionerimozione
IteratoreADT IteratorADT Iterableinterface PositionList (2)class NodePositionList (2)class ElementIterator<E>
Iteratore di Posizioniinterface PositionList (3)class NodePositionList (3)
liste in java.util
2
3
ADT e interfaccie GT 2
Astrazione nelle strutture dati Abstract Data Type (ADT)
Abstract Data Type (ADT)modello matematico della struttura datispecifica
tipi dei dati memorizzatioperazioni supportate sui datitipi 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
4
Lista di Nodi
ADT perLista di Nodi NodeListposizione (nella lista) Position
Motivazioniaccedere direttamente ai nodiaccedere in base alla posizione di un nodo, relativamente agli altri nodi
Lista: collezione di elementi, che memorizza ciascun elemento in una posizionegli elementi sono organizzati con ordine lineare
3
5
ADT Position
Metodo:element()ritorna l’elemento associato alla posizione
N.B.: la posizione è sempre definita relativamente ai nodi vicini
Esempi:mazzo di cartecursore in un text editor
6
ADT NodeList
Metodi:first() ritorna la posizione del primo elementolast() ritorna la posizione dell’ultimo elementoprev(p) ritorna la posizione dell’elemento che precede pnext(p) ritorna la posizione dell’elemento che segue p
Errori:first() and last(): se lista vuotaprev(p): se p è primo elementonext(p): se p è ultimo elemento
N.B.: non c’è riferimento all’elementosi suppone che le posizioni siano valide
4
7
ADT NodeList (cont.)
Metodi di aggiornamento:set(p,e)
rimpiazza l’elemento alla posizione p con l’elemento eritorna l’elemento che era in p
addFirst(e) inserisce l’elemento e come primo elementoaddLast(e) inserisce l’elemento e come ultimo elementoaddBefore(p,e) inserisce l’elemento e prima della pos. paddAfter(p,e) inserisce l’elemento e dopo la pos. premove(p)
invalida la posizione pritorna l’elemento che era in p
8
ADT NodeList (cont.)
Errori se la posizione passata come argomento non è valida
p == nullp era stato cancellatop posizione di una lista diversa
nei metodiprev(p): se p è prima posizionenext(p): se p è ultima posiozione
5
9
Esempio
10
Interface Position
6
11
Interface PositionList
12
Interface PositionList (cont.)
7
13
Nodo
Nodo: implementa Positionper Lista di Nodi
class DNode implements Postion<E>
es.: Position<String> p = new DNode<String>();
prev next
elem node
oggetto di tipo DNode<String>
Position<String> p contieneriferimento ad oggetto di tipoDNode<String>
p
14
class DNode (1/2) prev next
elem node
8
15
class DNode (2/2) prev next
elem node
16
Lista doppia con sentinelle: class NodePositionList
nodes/positions
elements
PositionList<String> p = new NodePositionList<String>();
p
trailer
header
4numElts oggetto di tipoNodePositionList<String>
riferimento adoggetto di tipoPositionList<String>
9
17
class NodePositionList
costruttore
trailer
header
21
1
2trailer
header
0numElts
1
18
class NodePositionList: CheckPosition
controlla se la Position p è valida
10
19
class NodePositionList: ... CheckPosition
cast: da Position a DNode
20
class NodePositionList
11
21
Inserzione
addBefore(p, X)
A B C
p
A B C
XnewNode
p
A B X C
pnewNode
22
class NodePositionList (addBefore)
v
2
A B X C
p1
3
newNode
1
2
3
12
23
class NodePositionList (remove)
p
v vNextvPrev
24
Argomenti della lezione
ADT PositionNodeList
interfacePositionPositionList
classDNodeNodePositionList
inserzionerimozione
IteratoreADT IteratorADT Iterableinterface PositionList (2)class NodePositionList (2)class ElementIterator<E>
Iteratore di Posizioniinterface PositionList (3)class NodePositionList (3)
liste in java.util
13
25
ADT Iterator
per scandire una collezione, un elemento alla volta
metodiboolean hasNest()
controlla se ci sono ancora elementi inesploratiObject next()
ritorna prossimo riferimento a prossimo elemento
il metodo remove() in genere non si implementa
26
ADT Iterable
per collezioni che possono essere scandite con Iterator
metodo:iterator(): ritorna un Iterator sulla collezione
esempio: seconda versione interfaccia PositionList
14
27
Esempio uso iteratore in PositionList
nella classe NodePositionList
Esempio uso per metodo toString()
es.: fare con StringBuffer
28
Esempio classe iteratore per PositionList
15
29
Iteratore di posizioni (in PositionList)
aggiunta del metodo positions() all’ interfaccia PositionListritorna un oggetto Iterable con le posizioni
terza versione interfaccia PositionList
30
Iteratore di posizioni (in PositionList)
aggiunta del metodo positions() nella classe NodePositionListritorna un oggetto Iterable con le posizioni
16
31
Costrutto Java 5 For-Each Loop GT: 6.3.2
Non aggiunge alcuna nuova funzionalità al linguaggio,è utile per semplificare la formulazione di cicliSintassi :
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 IterableIterable
Statement è l’istruzione semplice o composta che viene iterata, che costituisce il corpo del ciclo
forfor ( ( DeclarationDeclaration : : ExpressionExpression ) Statement;) Statement;
32
Esempio con array
String primi[] = new String[] { "2", "3", "5", "7" };String txt= " ";
for (int i = 0; i < primi.length; i ++ )
txt = txt + " " + primi[i];
for ( String str: primi )
txt = txt + " " + str;
Ciclo for normale
Ciclo For-Each su arrayDichiarazione Espressione
Statement
17
33
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= " ";
Iterator<String> it = parole.iterator();while ( it.hasNext() ) {
String str = it.next();txt = txt + " " + str;
}
for ( String str: parole ) {txt = txt + " " + str;
}
Ciclo con Iterator
Ciclo For-Each
34
6.3.4 java.util.LinkedList
non ha concetto di posizioneusa un cursore sulla lista: posizione tra due elementiMetodi di LinkedListIterator:
add(e): aggiunge elemento e alla posizione del cursorehasNext(): 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 precedentepreviousIndex(): ritorna l’indice dell’elemento seguenteset(e): rimpiazza con e l’ultimo el. ritornato da next o previousremove(): rimuove l’ultimo el. ritornato da next o previous
18
35
6.3.4 problema iteratori multipli
iteratori multipli su una stessa collezionese un iteratore modifica la collezione: sono guai!!
Java.util: fail fastinvalida tutti gli altri
interfaccia java.util.Listclassi
java.util.ArrayListjava.util.LinkedList
36
6.4 Java Collections Framework in java.util
InterfaccieCollection: estende Iterable ha metodo iterator()IteratorList: estende Collection, metodo listIterator()ListIterator: vedi slides prec.Map: mappa chiavi a valoriQueue: coda con nomi suoiSet: insiemi
classe java.util.LinkedListmetodi ADT deque (GT 5.3) e ADT arrayList (GT 6.1)
19
37
6.4.3 ADT Sequence
metodi ADT deque (GT 5.3), ADT arrayList (GT 6.1) e ADT nodelist (GT 6.2).
+ due metodi di conversione indice posizione
38
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 convariabile nell’oggetto Positionmetodo in collezione
C- 6.15: come implementare iteratori fail fast, se la collezione viene modificata?
sugg.: tenere contatore versione collezione