Sei sulla pagina 1di 19

Liste doppie

GT: 6.2 (e 3.3)


Doubly Linked Lists

Argomenti della lezione

ADT Iteratore
Position ADT Iterator
NodeList ADT Iterable
interface interface PositionList (2)
Position class NodePositionList (2)
PositionList class ElementIterator<E>
class
DNode Iteratore di Posizioni
NodePositionList interface PositionList (3)
inserzione class NodePositionList (3)
rimozione
liste in java.util

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

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

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

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

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

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

4
Esempio

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 prev next

Position<String> p contiene
riferimento ad oggetto di tipo
elem node
DNode<String>

oggetto di tipo DNode<String>


13

class DNode (1/2) prev 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 numElts
oggetto di tipo 4 oggetto di tipo
p
PositionList<String> header NodePositionList<String>

trailer

nodes/positions

elements 16

8
class NodePositionList

costruttore

1
2

trailer
numElts 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 C
p

A B C
newNode
X
p
newNode

A B X C
21

class NodePositionList (addBefore)


newNode v
p
2 1

3
A B X C

1
2
3
22

11
class NodePositionList (remove)

vPrev v vNext

23

Argomenti della lezione

ADT Iteratore
Position ADT Iterator
NodeList ADT Iterable
interface interface PositionList (2)
Position class NodePositionList (2)
PositionList class ElementIterator<E>
class
DNode Iteratore di Posizioni
NodePositionList interface PositionList (3)
inserzione class NodePositionList (3)
rimozione
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

Potrebbero piacerti anche