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