Roadmap - tritone.ing.unibs.ittritone.ing.unibs.it/fp/Slides/VersionePDF/13-StruttureDati...Modulo...

64
Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Strutture dati + Generics 1 Fondamenti di Programmazione Roadmap Roadmap 0. Primi passi con Java 0. Primi passi con Java 1. Buone abitudini 1. Buone abitudini 2. Tipi di dati primitivi 2. Tipi di dati primitivi 3. Uso di classi 3. Uso di classi 4. Leggere e scrivere 4. Leggere e scrivere 5. Definire metodi 5. Definire metodi 6. Strutture di controllo 6. Strutture di controllo 7. 7. Array Array e e Collection Collection 8. Progetto di classi 8. Progetto di classi 9. Ereditarietà 9. Ereditarietà 10. Eccezioni 10. Eccezioni 11. 11. Stream Stream 12. 12. Ricorsione Ricorsione 13. Strutture dati + 13. Strutture dati + Generics Generics Fondamenti di Programmazione Strutture dati "classiche" Strutture dati "classiche" Tipi di dati astratti, di uso generale, per i quali Tipi di dati astratti, di uso generale, per i quali sono definiti alcuni metodi standard sono definiti alcuni metodi standard Data la loro struttura generale e la loro utilità Data la loro struttura generale e la loro utilità universale, possono venire realizzate in universale, possono venire realizzate in qualunque linguaggio di programmazione qualunque linguaggio di programmazione Spesso hanno natura Spesso hanno natura ricorsiva ricorsiva Esamineremo dapprima le strutture fornite Esamineremo dapprima le strutture fornite dalla libreria Java, quindi dalla libreria Java, quindi vedemo vedemo come come scriverne noi scriverne noi

Transcript of Roadmap - tritone.ing.unibs.ittritone.ing.unibs.it/fp/Slides/VersionePDF/13-StruttureDati...Modulo...

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 1

Fondamenti di Programmazione

RoadmapRoadmap

•• 0. Primi passi con Java0. Primi passi con Java

•• 1. Buone abitudini1. Buone abitudini

•• 2. Tipi di dati primitivi2. Tipi di dati primitivi

•• 3. Uso di classi3. Uso di classi

•• 4. Leggere e scrivere4. Leggere e scrivere

•• 5. Definire metodi5. Definire metodi

•• 6. Strutture di controllo6. Strutture di controllo

•• 7. 7. Array Array e e CollectionCollection

•• 8. Progetto di classi8. Progetto di classi

•• 9. Ereditarietà9. Ereditarietà

•• 10. Eccezioni10. Eccezioni

•• 11. 11. StreamStream

•• 12. 12. RicorsioneRicorsione

•• 13. Strutture dati + 13. Strutture dati + GenericsGenerics

Fondamenti di Programmazione

Strutture dati "classiche"Strutture dati "classiche"

•• Tipi di dati astratti, di uso generale, per i quali Tipi di dati astratti, di uso generale, per i quali sono definiti alcuni metodi standardsono definiti alcuni metodi standard

•• Data la loro struttura generale e la loro utilità Data la loro struttura generale e la loro utilità universale, possono venire realizzate in universale, possono venire realizzate in qualunque linguaggio di programmazionequalunque linguaggio di programmazione

•• Spesso hanno natura Spesso hanno natura ricorsivaricorsiva

•• Esamineremo dapprima le strutture fornite Esamineremo dapprima le strutture fornite dalla libreria Java, quindi dalla libreria Java, quindi vedemovedemo come come scriverne noiscriverne noi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 2

Fondamenti di Programmazione

Java Java Collection FrameworkCollection Framework

•• A partire da Java 2, il package java.A partire da Java 2, il package java.util util contiene il Java contiene il Java CollectionCollection FrameworkFramework (JCF) (JCF) un insieme di interface, classi e classi astratte un insieme di interface, classi e classi astratte progettate organicamente per facilitare la progettate organicamente per facilitare la creazione e l’utilizzo di vari tipi di strutture creazione e l’utilizzo di vari tipi di strutture dati collettivedati collettive

•• Alcune classi esistenti nelle versioni Alcune classi esistenti nelle versioni precedenti (p.e. precedenti (p.e. VectorVector) sono state riadattate ) sono state riadattate in modo da far parte del JCFin modo da far parte del JCF

Fondamenti di Programmazione

Un Un framework framework complessocomplesso

•• Il JCF ha subito costanti evoluzioni (e ingrandimenti) in Il JCF ha subito costanti evoluzioni (e ingrandimenti) in tutte le versioni di Java seguite alla 1.2tutte le versioni di Java seguite alla 1.2

•• Nella versione 6 esso comprende: 19 interface (5 di Nella versione 6 esso comprende: 19 interface (5 di supporto), 6 classi astratte, 12 classi supporto), 6 classi astratte, 12 classi istanziabiliistanziabili di uso di uso generale, 2 classi contenenti solo metodi generale, 2 classi contenenti solo metodi static static di di utilità, 16 classi per usi speciali, 2 classi di eccezioniutilità, 16 classi per usi speciali, 2 classi di eccezioni

•• Vedremo alcune nozioni generali, per un’analisi Vedremo alcune nozioni generali, per un’analisi dettagliata è più produttivo consultare la dettagliata è più produttivo consultare la documentazionedocumentazione

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 3

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Fondamenti di Programmazione

Tipi di dati parametriciTipi di dati parametrici(da Java 1.5 in poi)(da Java 1.5 in poi)

•• Come già visto implicitamente per i Come già visto implicitamente per i VectorVector, le , le definizioni di interface e classi nel JCF sono definizioni di interface e classi nel JCF sono parametriche rispetto ad altri tipi di datiparametriche rispetto ad altri tipi di dati

•• Ad esempio, la nozione di Ad esempio, la nozione di Vector Vector è quella di un è quella di un contenitore di qualunque tipo di dato al suo interno, contenitore di qualunque tipo di dato al suo interno, pertanto essa è parametrica rispetto al tipo di dato pertanto essa è parametrica rispetto al tipo di dato contenutocontenuto

•• Sintatticamente questo è espresso dalle parentesi Sintatticamente questo è espresso dalle parentesi angolari <> che racchiudono il tipo di dato angolari <> che racchiudono il tipo di dato parametricoparametrico

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 4

Fondamenti di Programmazione

Tipi di dati parametriciTipi di dati parametrici

public class public class VectorVector<E><E>

. . .. . .

Vector Vector <<StringString> elenco = new > elenco = new VectorVector<<StringString>();>();

La documentazione riporta la definizione che è parametrica rispetto ad un tipo di dato generico E

Quando si utilizza concretamente la classe, il tipo generico viene sostituito con un tipo specifico (in questo caso String)

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 5

Fondamenti di Programmazione

L’interface L’interface CollectionCollection

public interface public interface CollectionCollection<E> <E> extends Iterableextends Iterable

•• E’ l’interface basilare del JCF e rappresenta una E’ l’interface basilare del JCF e rappresenta una raccolta generica di oggetti di tipo raccolta generica di oggetti di tipo EE

•• E’ implementata dalla maggior parte delle classi E’ implementata dalla maggior parte delle classi (anche astratte) del JCF(anche astratte) del JCF

•• Specifica 15 metodi di cui 6 opzionaliSpecifica 15 metodi di cui 6 opzionali

•• Uno dei metodi più significativi è Uno dei metodi più significativi è iteratoriterator(), ereditato (), ereditato a sua volta dall’interface a sua volta dall’interface IterableIterable

Fondamenti di Programmazione

L’interface L’interface CollectionCollection

boolean addboolean add(E e) (E e) Ensures that this collection containsEnsures that this collection contains the the specified element specified element (optional (optional operationoperation).).

boolean addAllboolean addAll((CollectionCollection<? <? extendsextends E> c) E> c) Adds allAdds all of the of the elementselements in the in the specified collection to this specified collection to this collectioncollection (optional (optional operationoperation). ).

void clearvoid clear() () Removes allRemoves all of the of the elements from this collectionelements from this collection (optional (optional operationoperation). ).

boolean containsboolean contains((ObjectObject o) o) Returns true if this collection containsReturns true if this collection contains the the specified elementspecified element..

boolean containsAllboolean containsAll((CollectionCollection<?> c) <?> c) Returns true if this collection contains allReturns true if this collection contains all of the of the elementselements in in the the specified collectionspecified collection. .

boolean equalsboolean equals((ObjectObject o) o) ComparesCompares the the specified object with this collection for equalityspecified object with this collection for equality. .

Sorvoliamo su alcuni dettagli da approfondire in seguito

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 6

Fondamenti di Programmazione

L’interface L’interface CollectionCollectionint hashCodeint hashCode() ()

ReturnsReturns the the hashhash code code value for this collectionvalue for this collection. .

boolean isEmptyboolean isEmpty() () Returns true if this collection containsReturns true if this collection contains no no elementselements..

IteratorIterator<E> <E> iteratoriterator() () Returns an iteratorReturns an iterator over the over the elementselements in in this collectionthis collection..

boolean removeboolean remove((ObjectObject o) o) RemovesRemoves a single a single instanceinstance of the of the specified element from this specified element from this collectioncollection, , if it is presentif it is present (optional (optional operationoperation).).

boolean removeAllboolean removeAll((CollectionCollection<?> c) <?> c) Removes allRemoves all of of this collection's elements thatthis collection's elements that are are also also containedcontained in the in the specified collectionspecified collection (optional (optional operationoperation).).

boolean retainAllboolean retainAll((CollectionCollection<?> c) <?> c) Retains onlyRetains only the the elementselements in in this collection that this collection that are are containedcontainedin the in the specified collectionspecified collection (optional (optional operationoperation). ).

Sorvoliamo su alcuni dettagli da approfondire in seguito

Fondamenti di Programmazione

L’interface L’interface CollectionCollection

int sizeint size() () ReturnsReturns the the numbernumber of of elementselements in in this collectionthis collection. .

ObjectObject[] [] toArraytoArray() () Returns an array containing allReturns an array containing all of the of the elementselements in in this this collectioncollection. .

<T> T[] <T> T[] toArraytoArray(T[] a) (T[] a) Returns an array containing allReturns an array containing all of the of the elementselements in in this this collectioncollection; the ; the runtime typeruntime type of the of the returned array is thatreturned array is that of of the the specified arrayspecified array. .

Sorvoliamo su alcuni dettagli da approfondire in seguito

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 7

Fondamenti di Programmazione

L’interface L’interface IterableIterable

public interface public interface IterableIterable<T><T>

•• L’interface L’interface IterableIterable specifica un solo metodo:specifica un solo metodo:

IteratorIterator<T> <T> iteratoriterator()()

•• Il metodo Il metodo iteratoriterator() restituisce un riferimento () restituisce un riferimento a un a un IteratorIterator<T> ovvero a un <T> ovvero a un iteratore iteratore sul sul tipo di oggetti contenuti nella tipo di oggetti contenuti nella CollectionCollection

•• Iterator Iterator è a sua volta un’interfaceè a sua volta un’interface

Fondamenti di Programmazione

L’interface L’interface IteratorIterator

public interface public interface IteratorIterator<E><E>

•• L’interface L’interface IteratorIterator specifica i metodi che deve specifica i metodi che deve fornire un “fornire un “iteratoreiteratore” ovvero un oggetto capace di ” ovvero un oggetto capace di scorrere uno a uno gli elementi di una raccoltascorrere uno a uno gli elementi di una raccolta

boolean hasNextboolean hasNext() () Returns true ifReturns true if the the iteration hasiteration has more more elementselements. .

E E nextnext() () ReturnsReturns the the next elementnext element in the in the iterationiteration. .

void removevoid remove() () Removes fromRemoves from the the underlying collectionunderlying collection the the last last element returned byelement returned by the the iteratoriterator (optional (optional operationoperation). ).

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 8

Fondamenti di Programmazione

Uso di Uso di iteratoriiteratori

•• Gli Gli iteratori iteratori offrono un modo alternativo (e offrono un modo alternativo (e tecnicamente più efficiente) di eseguire un tecnicamente più efficiente) di eseguire un operazione su tutti gli elementi di una operazione su tutti gli elementi di una CollectionCollection

VectorVector <<StringString> elenco = new > elenco = new VectorVector<<StringString>();>();. . .. . .IteratorIterator<<StringString> lancetta = elenco.> lancetta = elenco.iteratoriterator();();while while (lancetta.(lancetta.hasNexthasNext())())System.out.System.out.printlnprintln(lancetta.(lancetta.nextnext());());

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 9

Fondamenti di Programmazione

Famiglie di Famiglie di CollectionCollection

•• La documentazione di JCF indica 3 principali La documentazione di JCF indica 3 principali famiglie di famiglie di CollectionCollection, corrispondenti alle , corrispondenti alle seguenti interface che ereditano da seguenti interface che ereditano da CollectionCollection::–– Set<E>Set<E>

–– List <E>List <E>

–– QueueQueue<E> e <E> e DequeDeque <E><E>

Fondamenti di Programmazione

L’interface SetL’interface Set

•• Un Set è una Un Set è una Collection Collection con il vincolo con il vincolo aggiuntivo di non contenere elementi duplicati aggiuntivo di non contenere elementi duplicati (come gli insiemi della teoria degli insiemi)(come gli insiemi della teoria degli insiemi)

•• Di fatto non aggiunge la specifica di nuovi Di fatto non aggiunge la specifica di nuovi metodi a quelli ereditati da metodi a quelli ereditati da Collection Collection ma ma aumenta i requisiti di alcuni metodi (p.e. aumenta i requisiti di alcuni metodi (p.e. addadd) ) in modo che sia garantita la non duplicazionein modo che sia garantita la non duplicazione

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 10

Fondamenti di Programmazione

Le interface Le interface SortedSetSortedSet

•• L’interface L’interface SortedSet SortedSet estende Set con il requisito che estende Set con il requisito che esista una relazione di ordine totale tra gli elementi esista una relazione di ordine totale tra gli elementi (siano tutti confrontabili)(siano tutti confrontabili)

•• Questo rende possibile la specifica di metodi Questo rende possibile la specifica di metodi aggiuntivi: aggiuntivi: –– la selezione del primo o ultimo elemento nell’ordinela selezione del primo o ultimo elemento nell’ordine

–– la selezione di tutti gli elementi prima o dopo un certo la selezione di tutti gli elementi prima o dopo un certo elemento elemento

–– la selezione degli elementi in un certo la selezione degli elementi in un certo range range

Fondamenti di Programmazione

Le interface Le interface NavigableSetNavigableSet

•• L’interface L’interface NavigableSetNavigableSet estende estende SortedSetSortedSetcon svariati metodi di utilità aggiuntiva tra i con svariati metodi di utilità aggiuntiva tra i quali: quali: –– la selezione dell’elemento più vicino (prima o dopo la selezione dell’elemento più vicino (prima o dopo

nell’ordine, con o senza uguaglianza) rispetto a un nell’ordine, con o senza uguaglianza) rispetto a un elemento specificato elemento specificato

–– la possibilità di enumerare il Set in ordine inversola possibilità di enumerare il Set in ordine inverso

–– . . .. . .

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 11

Fondamenti di Programmazione

L’interface ListL’interface List

•• Una List è una Una List è una Collection Collection nella quale gli nella quale gli elementi sono ordinati elementi sono ordinati posizionalmente posizionalmente e e sono disponibili operazioni (accesso, sono disponibili operazioni (accesso, inserimento, eliminazione, ricerca, estrazione, inserimento, eliminazione, ricerca, estrazione, sostituzione) riferite ad indici posizionalisostituzione) riferite ad indici posizionali

•• Oltre Oltre all’Iterator all’Iterator “modello base” è possibile “modello base” è possibile creare un creare un ListIterator ListIterator che permette che permette “movimenti” “movimenti” bidirezionali bidirezionali sulla List ed sulla List ed operazioni di modifica del operazioni di modifica del contenuocontenuo

Fondamenti di Programmazione

Operazioni posizionali su ListOperazioni posizionali su List

void addvoid add((int indexint index, E , E elementelement) ) InsertsInserts the the specified elementspecified element at the at the specifiedspecified position in position in thisthislist (optional list (optional operationoperation).).

boolean addAllboolean addAll((int indexint index, , CollectionCollection<? <? extendsextends E> c) E> c) Inserts allInserts all of the of the elementselements in the in the specified collection into thisspecified collection into thislist at the list at the specifiedspecified position (optional position (optional operationoperation).).

E E getget((int indexint index) ) ReturnsReturns the the elementelement at the at the specifiedspecified position in position in thisthis list. list.

int indexOfint indexOf((ObjectObject o) o) ReturnsReturns the the indexindex of the first of the first occurrenceoccurrence of the of the specified elementspecified elementin in thisthis list, or list, or --1 1 if thisif this list list does not containdoes not contain the the elementelement..

int lastIndexOfint lastIndexOf((ObjectObject o) o) ReturnsReturns the the indexindex of the of the last occurrence last occurrence of the of the specified elementspecified elementin in thisthis list, or list, or --1 1 if thisif this list list does not containdoes not contain the the elementelement..

Inserimento

Accesso

Ricerca: si cerca un elemento tale che o.equals(elemento) sia true

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 12

Fondamenti di Programmazione

Operazioni posizionali su ListOperazioni posizionali su List

E E removeremove((int indexint index) ) RemovesRemoves the the elementelement at the at the specifiedspecified position in position in thisthis list list (optional (optional operationoperation).).

E set(E set(int indexint index, E , E elementelement) ) ReplacesReplaces the the elementelement at the at the specifiedspecified position in position in thisthis list list withwiththe the specified elementspecified element (optional (optional operationoperation).).

List<E> List<E> subListsubList((int fromIndexint fromIndex, , int toIndexint toIndex) ) ReturnsReturns a a viewview of the of the portionportion of of thisthis list list betweenbetween the the specified specified fromIndexfromIndex, inclusive, and , inclusive, and toIndextoIndex, , exclusiveexclusive. .

Eliminazione

Sostituzione

Estrazione di una sottolista tra due posizioni (la prima inclusa, la seconda no)

Fondamenti di Programmazione

L’interface L’interface ListIteratorListIterator

•• Si può creare un Si può creare un ListIterator ListIterator in due modi (a in due modi (a partire dall’inizio della lista o da una posizione partire dall’inizio della lista o da una posizione specificata)specificata)

ListIteratorListIterator<E> <E> listIteratorlistIterator() () ReturnsReturns a list a list iteratoriterator over the over the elementselements in in thisthislist (in list (in proper sequenceproper sequence). ).

ListIteratorListIterator<E> <E> listIteratorlistIterator((int indexint index) ) ReturnsReturns a list a list iteratoriterator of the of the elementselements in in thisthislist (in list (in proper sequenceproper sequence), ), startingstarting at the at the specifiedspecified position in position in thisthis list. list.

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 13

Fondamenti di Programmazione

L’interface L’interface ListIteratorListIterator

•• Oltre ai due metodi per “scorrere avanti” ed al Oltre ai due metodi per “scorrere avanti” ed al removeremove disponibili in disponibili in IteratorIterator, offre:, offre:–– due metodi duali per “scorrere indietro” due metodi duali per “scorrere indietro”

–– due metodi per sapere in che posizione è due metodi per sapere in che posizione è l’iteratorel’iteratore

–– aggiunta e sostituzione di un elementoaggiunta e sostituzione di un elemento

Fondamenti di Programmazione

L’interface L’interface ListIteratorListIterator

boolean hasPreviousboolean hasPrevious() () Returns true if thisReturns true if this list list iterator hasiterator has more more elements elements when traversingwhen traversing the list in the the list in the reversereverse direction.direction.

E E previousprevious() () ReturnsReturns the the previous elementprevious element in the list.in the list.

int nextIndexint nextIndex() () ReturnsReturns the the indexindex of the of the element that would be returned element that would be returned byby a a subsequent call to nextsubsequent call to next..

int previousIndexint previousIndex() () ReturnsReturns the the indexindex of the of the element that would be returned element that would be returned byby a a subsequent call to previoussubsequent call to previous..

Scorrimento “all’indietro”

Posizione dell’iteratore

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 14

Fondamenti di Programmazione

L’interface L’interface ListIteratorListIteratorvoid addvoid add(E e) (E e)

InsertsInserts the the specified element intospecified element into the list the list (optional (optional operationoperation).).

voidvoid set(E e) set(E e) ReplacesReplaces the the last element returned by nextlast element returned by next or or previous withprevious with the the specified elementspecified element (optional (optional operationoperation).).

void removevoid remove() () Removes fromRemoves from the list the the list the last element that was last element that was returned by nextreturned by next or or previousprevious (optional (optional operationoperation). ).

L’operazione di aggiunta è riferita alla posizione dell’iteratore

Le operazioni set e remove sono riferite all’ultimo elemento acceduto con next o previous (se non esiste o è stato già eliminato, si ha un’eccezione)

Fondamenti di Programmazione

Prima di Prima di addadd

nextprevious

0 1 2 size()-1

. . .

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 15

Fondamenti di Programmazione

Dopo Dopo addadd

0 1nextprevious

2 3

. . .

Fondamenti di Programmazione

L’interface L’interface QueueQueue

•• Rappresenta una coda ovvero una struttura Rappresenta una coda ovvero una struttura dove si inseriscono elementi (ingresso in dove si inseriscono elementi (ingresso in coda) e solo un elemento (la testa della coda) coda) e solo un elemento (la testa della coda) è disponibile per l’accesso o per l’estrazione è disponibile per l’accesso o per l’estrazione (uscita dalla coda)(uscita dalla coda)

•• La politica di selezione dell’elemento in testa La politica di selezione dell’elemento in testa è tipicamente FIFO ma sono possibili anche è tipicamente FIFO ma sono possibili anche code con “scavalcamento” basato su qualche code con “scavalcamento” basato su qualche criterio di ordinamento o prioritàcriterio di ordinamento o priorità

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 16

Fondamenti di Programmazione

L’interface L’interface QueueQueue

•• Esistono tre operazioni base su una Esistono tre operazioni base su una QueueQueue::–– inserimento di un elemento in codainserimento di un elemento in coda

–– accesso all’elemento in testa (senza toglierlo dalla accesso all’elemento in testa (senza toglierlo dalla coda)coda)

–– estrazione dell’elemento in testa (eliminandolo estrazione dell’elemento in testa (eliminandolo dalla coda)dalla coda)

•• Di ognuna esistono due versioni a seconda Di ognuna esistono due versioni a seconda del comportamento quando l’operazione non del comportamento quando l’operazione non è possibile: una lancia un’eccezione, l’altra è possibile: una lancia un’eccezione, l’altra ritorna false o ritorna false o nullnull

Fondamenti di Programmazione

L’interface L’interface QueueQueue

•• Lanciano eccezioneLanciano eccezione

boolean add(E e) Aggiunta elemento

E element() Accesso elemento in testa

E remove() Estrazione elemento in testa

•• Non lanciano eccezioneNon lanciano eccezione

boolean offer(E e) Aggiunta elemento

E peek() Accesso elemento in testa

E poll() Estrazione elemento in testa

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 17

Fondamenti di Programmazione

L’interface L’interface DequeDeque

•• Il nome Il nome Deque Deque sta per “sta per “double ended queuedouble ended queue” è ” è un’interface che estende un’interface che estende Queue Queue poiché rappresenta poiché rappresenta una struttura con due estremi (testa e coda, head e una struttura con due estremi (testa e coda, head e tailtail) ed operazioni di inserimento, accesso ed ) ed operazioni di inserimento, accesso ed estrazione su entrambi gli estremiestrazione su entrambi gli estremi

•• Come nel caso precedente, per ogni operazione Come nel caso precedente, per ogni operazione esistono due versioni (una lancia eccezioni, una no)esistono due versioni (una lancia eccezioni, una no)

•• I metodi ereditati da I metodi ereditati da Queue Queue sono “affiancati” da sono “affiancati” da metodi equivalenti con nomi più specificimetodi equivalenti con nomi più specifici

Fondamenti di Programmazione

DequeDeque: operazioni in testa: operazioni in testa

•• Lanciano eccezioneLanciano eccezione

boolean addFirst(E e) Aggiunta elemento in testa

E getFirst () Accesso elemento in testa

E removeFirst () Estrazione elemento in testa

•• Non lanciano eccezioneNon lanciano eccezione

boolean offerFirst (E e) Aggiunta elemento in testa

E peekFirst () Accesso elemento in testa

E pollFirst () Estrazione elemento in testa

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 18

Fondamenti di Programmazione

DequeDeque: operazioni in coda: operazioni in coda

•• Lanciano eccezioneLanciano eccezione

boolean addLast(E e) Aggiunta elemento in coda

E getLast () Accesso elemento in coda

E removeLast () Estrazione elemento in coda

•• Non lanciano eccezioneNon lanciano eccezione

boolean offerLast (E e) Aggiunta elemento in coda

E peekLast () Accesso elemento in coda

E pollLast () Estrazione elemento in coda

Fondamenti di Programmazione

DequeDeque: metodi aggiuntivi: metodi aggiuntivi

IteratorIterator<E> <E> descendingIteratordescendingIterator() () Returns an iteratorReturns an iterator over the over the elementselements in in this dequethis deque in in reverse reverse sequential ordersequential order..

boolean removeFirstOccurrenceboolean removeFirstOccurrence((ObjectObject o) o) RemovesRemoves the first the first occurrenceoccurrence of the of the specified element from this specified element from this dequedeque. .

boolean removeLastOccurrenceboolean removeLastOccurrence((ObjectObject o) o) RemovesRemoves the the last occurrencelast occurrence of the of the specified element from this specified element from this dequedeque. .

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 19

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

La nozione di La nozione di StackStack

Fondamenti di Programmazione

La nozione di La nozione di stackstack (pila)(pila)

Operazioni solo sulla cima della pila:push (aggiunta),pop (estrazione),peek (accesso)

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 20

Fondamenti di Programmazione

La nozione di La nozione di stackstack

•• Uno Uno stack stack è una forma limitata di è una forma limitata di Deque Deque nella nella quale si opera sempre in testa e mai in codaquale si opera sempre in testa e mai in coda

•• L’interface L’interface Deque Deque specifica tre metodi con i specifica tre metodi con i nomi “tipici” della nozione di nomi “tipici” della nozione di stack stack (essi (essi “affiancano” tre metodi equivalenti della “affiancano” tre metodi equivalenti della specifica generale)specifica generale)

Fondamenti di Programmazione

DequeDeque: metodi per uso a : metodi per uso a stackstack

•• Nomi metodi Nomi metodi stackstack

void push(E e) Aggiunta elemento in cima

E peek () Accesso elemento in cima

E pop () Estrazione elemento in cima

•• Metodi “equivalenti”Metodi “equivalenti”

boolean addFirst(E e) Aggiunta elemento in testa

E peekFirst () Accesso elemento in testa

E removeFirst () Estrazione elemento in testa

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 21

Fondamenti di Programmazione

RipensamentiRipensamenti

•• Il package java.Il package java.util util contiene (da sempre) contiene (da sempre) anche una classe anche una classe StackStack, derivata da , derivata da VectorVector, , con i tre metodi push, pop e con i tre metodi push, pop e peekpeek

•• Il suo uso è tuttavia “sconsigliato” e si Il suo uso è tuttavia “sconsigliato” e si suggerisce di usare un’implementazione di suggerisce di usare un’implementazione di Deque Deque nel modo sopra indicatonel modo sopra indicato

•• La classe La classe Stack Stack non fa parte del JCFnon fa parte del JCF

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

La nozione di La nozione di StackStack

L’interface L’interface MapMap

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 22

Fondamenti di Programmazione

L’interface L’interface MapMap

•• Il JCF non si basa solo sull’interface Il JCF non si basa solo sull’interface Collection Collection ma ma anche sull’interface “parallela” anche sull’interface “parallela” MapMap<K,V><K,V>

•• Mentre la Mentre la Collection Collection è una raccolta “semplice” di è una raccolta “semplice” di elementi, la elementi, la Map Map è una raccolta indicizzata di è una raccolta indicizzata di elementi: ogni elemento viene inserito elementi: ogni elemento viene inserito accompagnato da un altro elemento detto chiave accompagnato da un altro elemento detto chiave ((keykey) che lo identifica univocamente) che lo identifica univocamente

•• Questo permette di accedere agli elementi di una Questo permette di accedere agli elementi di una Map Map non solo tramite iterazione o accesso non solo tramite iterazione o accesso posizionale, ma anche tramite accesso diretto basato posizionale, ma anche tramite accesso diretto basato su chiave su chiave

Fondamenti di Programmazione

Uso di chiaviUso di chiavi

•• L’uso di chiavi univoche è molto diffuso per L’uso di chiavi univoche è molto diffuso per l’identificazione di elementi:l’identificazione di elementi:–– codice fiscale per le personecodice fiscale per le persone

–– matricola per studenti universitarimatricola per studenti universitari

–– targhe per autoveicolitarghe per autoveicoli

–– codice a tre lettere per aeroporti (e alfanumerico codice a tre lettere per aeroporti (e alfanumerico per ciascun volo)per ciascun volo)

–– codici di prenotazionecodici di prenotazione

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 23

Fondamenti di Programmazione

L’interface L’interface MapMap

•• L’interfaccia L’interfaccia MapMap<K, V> è parametrica <K, V> è parametrica rispetto a due tipi di dati:rispetto a due tipi di dati:–– K rappresenta il tipo usato come chiaveK rappresenta il tipo usato come chiave

–– V rappresenta il tipo degli elementi contenuti nella V rappresenta il tipo degli elementi contenuti nella Map Map e indicizzati dalle chiavie indicizzati dalle chiavi

Fondamenti di Programmazione

L’interface L’interface MapMap: relazioni : relazioni con con CollectionCollection

•• Anche se non è formalmente derivata Anche se non è formalmente derivata dall’interface dall’interface CollectionCollection, l’interface , l’interface Map Map ha ha alcune “parentele” con essa:alcune “parentele” con essa:–– alcuni metodi, (alcuni metodi, (clearclear, , isEmptyisEmpty, , sizesize) con lo stesso ) con lo stesso

nome e lo stesso ruolo che hanno in nome e lo stesso ruolo che hanno in Collection Collection

–– tre possibilità di accedere al contenuto di una tre possibilità di accedere al contenuto di una Map Map sotto forma di sotto forma di CollectionCollection

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 24

Fondamenti di Programmazione

L’interface L’interface MapMap: aggiunta: aggiuntacon metodo con metodo putput

V V putput(K (K keykey, V , V valuevalue) )

Se la key passata come argomento non è presente nella map, viene aggiunta la nuova coppia key-valueSe invece la key è già presente, il nuovo value sostituisce quello precedentemente associato alla key

Fondamenti di Programmazione

L’interface L’interface MapMap: metodo : metodo putput

Milano Malpensa……

Bergamo……

Roma Fiumicino……

“BGY”“MXP”“FCO”

putput("VRN", new ("VRN", new AirportAirport("Verona", . . .)) ("Verona", . . .))

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 25

Fondamenti di Programmazione

L’interface L’interface MapMap: metodo : metodo putput

Milano Malpensa……

Bergamo……

Roma Fiumicino……

“BGY”“MXP”“FCO”

putput("VRN", new ("VRN", new AirportAirport("Verona", . . .)) ("Verona", . . .))

Verona……

“VRN”

Fondamenti di Programmazione

L’interface L’interface MapMap: metodo : metodo putput

Milano Malpensa……

Bergamo……

Roma Fiumicino……

“BGY”“MXP”“FCO”

putput("BGY", new ("BGY", new AirportAirport("Milano Orio", . . .)) ("Milano Orio", . . .))

Verona……

“VRN”

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 26

Fondamenti di Programmazione

L’interface L’interface MapMap: metodo : metodo putput

Milano Malpensa……

Milano Orio……

Roma Fiumicino……

“BGY”“MXP”“FCO”

putput("BGY", new ("BGY", new AirportAirport("Milano Orio", . . .)) ("Milano Orio", . . .))

Verona……

“VRN”

Fondamenti di Programmazione

L’interface L’interface MapMap: accesso: accesso(con o senza eliminazione)(con o senza eliminazione)

V V removeremove ((Object keyObject key) )

V V getget((Object keyObject key) )

Se la key passata come argomento è presente nella map, viene restituito un riferimento al value corrispondente e la coppia key-value viene eliminata dalla map, altrimenti viene restituito null

Se la key passata come argomento è presente nella map, viene restituito un riferimento al value corrispondente, altrimenti viene restituito null. Il contenuto della Map rimane immutato.

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 27

Fondamenti di Programmazione

L’interface L’interface MapMap: : verifiche di presenzaverifiche di presenza

boolean containsKey(Object key) Returns true if this map contains a mapping for the specified key.

boolean containsValue(Object value) Returns true if this map maps one or more keys to the specified value.

Fondamenti di Programmazione

L’interface L’interface MapMap: : vista come vista come CollectionCollection

•• Sono specificati metodi per:Sono specificati metodi per:–– ottenere una ottenere una Collection Collection contenente tutti i contenente tutti i values values

presenti nella presenti nella MapMapCollectionCollection<V> <V> valuesvalues() () ReturnsReturns a a Collection viewCollection view of the of the values containedvalues contained in in this mapthis map. .

–– ottenere un Set contenente tutte le ottenere un Set contenente tutte le keyskeys presenti presenti nella nella MapMapSet<K> Set<K> keySetkeySet()()ReturnsReturns a Set a Set viewview of the of the keys containedkeys contained in in this mapthis map. .

Per definizione non ci possono essere chiavi duplicate

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 28

Fondamenti di Programmazione

L’interface L’interface MapMap: : vista come vista come CollectionCollection

–– ottenere un Set contenente tutte le coppie ottenere un Set contenente tutte le coppie keykey--valuevalue presenti nella presenti nella MapMapSet<Set<MapMap.Entry<K,V>> .Entry<K,V>> entrySetentrySet()()ReturnsReturns a Set a Set viewview of the of the mappings containedmappings contained in in this this mapmap. .

Poiché non ci possono essere chiavi duplicate nemmeno le coppie possono essere duplicate

Gli elementi del Set implementano un’apposita interface dedicata alla rappresentazione di coppie key-value

Fondamenti di Programmazione

Le interface Le interface SortedMap SortedMap e e NavigableMapNavigableMap

•• In modo analogo a quanto visto per Set, In modo analogo a quanto visto per Set, l’interface l’interface SortedMap SortedMap estende estende MapMapaggiungendo un requisito di ordinamento aggiungendo un requisito di ordinamento totale sulle chiavi (e relativi metodi di utilità)totale sulle chiavi (e relativi metodi di utilità)

•• L’interface L’interface NavigableMap NavigableMap estende estende SortedMap SortedMap con altri metodi di utilità (concettualmente con altri metodi di utilità (concettualmente analoghi a quelli di analoghi a quelli di NavigableSetNavigableSet))

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 29

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

La nozione di La nozione di StackStack

L’interface L’interface MapMap

Dalle interface alle classiDalle interface alle classi

Fondamenti di Programmazione

Le classi Le classi ArrayList ArrayList e e VectorVector

•• La classi La classi ArrayList ArrayList e e VectorVector forniscono entrambe forniscono entrambe un’implementazione dell’interface List un’implementazione dell’interface List

•• La classe La classe ArrayListArrayList fornisce in aggiunta 3 metodi di fornisce in aggiunta 3 metodi di natura accessorianatura accessoria

•• La classe La classe Vector Vector ha svariati metodi ulteriori che ha svariati metodi ulteriori che riflettono il suo progetto precedente (metodi riflettono il suo progetto precedente (metodi “affiancati” con nomi diversi ma funzionalità “affiancati” con nomi diversi ma funzionalità identiche, operazioni sulla struttura interna di uso identiche, operazioni sulla struttura interna di uso piuttosto raro, …)piuttosto raro, …)

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 30

Fondamenti di Programmazione

Le classi Le classi ArrayList ArrayList e e VectorVector

•• La classe La classe ArrayList ArrayList è leggermente più efficiente di è leggermente più efficiente di VectorVector, in compenso , in compenso ArrayList ArrayList non è predisposta per non è predisposta per la programmazione multila programmazione multi--threadthread (argomento trattato (argomento trattato in corsi successivi) mentre in corsi successivi) mentre Vector Vector sìsì

•• Negli usi più comuni Negli usi più comuni ArrayList ArrayList e e Vector Vector possono possono essere considerate all’incirca equivalentiessere considerate all’incirca equivalenti

•• Alcuni libri di testo suggeriscono di usare Alcuni libri di testo suggeriscono di usare ArrayList ArrayList anziché anziché Vector Vector in quanto in quanto ArrayList ArrayList è stata progettata è stata progettata nel contesto di JCF, ma non ci sono forti motivi per nel contesto di JCF, ma non ci sono forti motivi per preferire l’una o l’altra a livello didattico inizialepreferire l’una o l’altra a livello didattico iniziale

Fondamenti di Programmazione

La classe La classe ArrayDequeArrayDeque

•• La classe La classe ArrayDeque ArrayDeque offre offre un’implementazione dell’interface un’implementazione dell’interface Deque Deque senza alcun metodo aggiuntivosenza alcun metodo aggiuntivo

•• Non è predisposta per la programmazione Non è predisposta per la programmazione multimulti--threadthread

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 31

Fondamenti di Programmazione

La classe La classe LinkedListLinkedList

•• La classe La classe LinkedList LinkedList ha una natura ha una natura “multiforme” in quanto implementa sia “multiforme” in quanto implementa sia l’interface List sia l’interface l’interface List sia l’interface Deque Deque (può (può quindi essere usata in alternativa ad quindi essere usata in alternativa ad entrambe)entrambe)

•• Non è predisposta per la programmazione Non è predisposta per la programmazione multimulti--threadthread

Fondamenti di Programmazione

Le classi Le classi HashSet HashSet e e LinkedHashSetLinkedHashSet

•• La classe La classe HashSet HashSet fornisce una semplice fornisce una semplice implementazione dell’interface Set (il nome implementazione dell’interface Set (il nome della classe deriva dalla struttura dati interna della classe deriva dalla struttura dati interna utilizzata per l’implementazione e non visibile)utilizzata per l’implementazione e non visibile)

•• La classe La classe LinkedHashSet LinkedHashSet è figlia di è figlia di HashSet HashSet e e aggiunge la caratteristica di mantenere aggiunge la caratteristica di mantenere sempre lo stesso ordine quando si effettua sempre lo stesso ordine quando si effettua l’enumerazione degli elementi (non garantito l’enumerazione degli elementi (non garantito da da HashSetHashSet))

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 32

Fondamenti di Programmazione

La classe La classe TreeSetTreeSet

•• La classe La classe TreeSet TreeSet fornisce fornisce un’implementazione dell’interface un’implementazione dell’interface NavigableSet NavigableSet (il nome della classe deriva dalla (il nome della classe deriva dalla struttura dati interna utilizzata per struttura dati interna utilizzata per l’implementazione e non visibile)l’implementazione e non visibile)

•• Le tre classi Le tre classi HashSetHashSet, , LinkedHashSet LinkedHashSet e e TreeSet TreeSet non sono predisposte per la non sono predisposte per la programmazione multiprogrammazione multi--threadthread

Fondamenti di Programmazione

Le classi Le classi HashMap HashMap e e HashtableHashtable

•• Entrambe le classi Entrambe le classi HashMap HashMap e e Hashtable Hashtable forniscono forniscono un’implementazione dell’interface un’implementazione dell’interface MapMap

•• La classe La classe Hashtable Hashtable ha alcuni metodi aggiuntivi che ha alcuni metodi aggiuntivi che riflettono il suo progetto preesistente, inoltre non riflettono il suo progetto preesistente, inoltre non ammette elementi o chiavi ammette elementi o chiavi null null (mentre (mentre HashMap HashMap sì) sì) ed è predisposta per la programmazione multied è predisposta per la programmazione multi--thread thread (mentre (mentre HashMapHashMap no)no)

•• Il rapporto tra Il rapporto tra HashMap HashMap e e Hashtable Hashtable è simile a quello è simile a quello tra tra ArrayList ArrayList e e VectorVector

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 33

Fondamenti di Programmazione

La classe La classe LinkedHashMapLinkedHashMap

•• La classe La classe LinkedHashMapLinkedHashMap è figlia di è figlia di HashMapHashMape aggiunge la caratteristica di mantenere e aggiunge la caratteristica di mantenere sempre lo stesso ordine quando si effettua sempre lo stesso ordine quando si effettua l’enumerazione degli elementi (non garantito l’enumerazione degli elementi (non garantito da da HashMapHashMap))

•• Il rapporto tra Il rapporto tra LinkedHashMapLinkedHashMap ed ed HashMap HashMap è è del tutto analogo a quello tra del tutto analogo a quello tra LinkedHashSetLinkedHashSeted ed HashSetHashSet

Fondamenti di Programmazione

La classe La classe TreeMapTreeMap

•• La classe La classe TreeMap TreeMap fornisce fornisce un’implementazione dell’interface un’implementazione dell’interface NavigableMap NavigableMap (il nome della classe deriva (il nome della classe deriva dalla struttura dati interna utilizzata per dalla struttura dati interna utilizzata per l’implementazione e non visibile)l’implementazione e non visibile)

•• Le tre classi Le tre classi HashMapHashMap, , LinkedHashMapLinkedHashMap e e TreeMap TreeMap non sono predisposte per la non sono predisposte per la programmazione multiprogrammazione multi--threadthread

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 34

Fondamenti di Programmazione

Classi “solo Classi “solo staticstatic”: ”: ArraysArrays•• La classe La classe Arrays Arrays contiene 105 metodi (molti in contiene 105 metodi (molti in

overloadingoverloading) per svolgere comuni operazioni utili su ) per svolgere comuni operazioni utili su array array (di tipi semplici o di (di tipi semplici o di ObjectObject) tra le quali:) tra le quali:–– asListasList: restituzione di una List con il contenuto : restituzione di una List con il contenuto dell’arraydell’array

–– binarySearchbinarySearch (18 versioni): ricerca efficiente di un elemento (18 versioni): ricerca efficiente di un elemento (richiede che (richiede che l’arrayl’array sia ordinato)sia ordinato)

–– copyOfcopyOf (10 versioni): crea una copia (10 versioni): crea una copia dell’arraydell’array in un nuovo in un nuovo arrayarray

–– copyOfRangecopyOfRange (10 versioni): crea una copia di un (10 versioni): crea una copia di un rangerange dell’arraydell’arrayin un nuovo in un nuovo arrayarray

–– equalsequals (9 versioni): confronta il contenuto di due (9 versioni): confronta il contenuto di due arrayarray

–– fillfill (18 versioni): riempimento con un certo valore(18 versioni): riempimento con un certo valore

–– sort sort (18 versioni): ordinamento(18 versioni): ordinamento

–– toString toString (9 versioni)(9 versioni)

Fondamenti di Programmazione

Classi “solo Classi “solo staticstatic”: ”: CollectionsCollections

•• La classe La classe CollectionsCollections contiene 52 metodi per svolgere contiene 52 metodi per svolgere svariate operazioni (anche non molto comuni) su svariate operazioni (anche non molto comuni) su CollectionCollection tra le quali:tra le quali:–– binarySearch binarySearch (2 versioni)(2 versioni)

–– copycopy

–– fill fill

–– max max e e min min (2 versioni ciascuno)(2 versioni ciascuno)

–– replaceAllreplaceAll

–– reversereverse

–– rotaterotate

–– shuffleshuffle (2 versioni) (2 versioni)

–– sortsort (2 versioni)(2 versioni)

–– swapswap

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 35

Fondamenti di Programmazione

RoadmapRoadmap

•• 13. Strutture dati + 13. Strutture dati + GenericsGenericsTipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

La nozione di La nozione di StackStack

L’interface L’interface MapMap

Dalle interface alle classiDalle interface alle classi

Guardando dentro: classi e interface genericheGuardando dentro: classi e interface generiche

Fondamenti di Programmazione

Classi e interface genericheClassi e interface generiche

•• Le interface e le classi appartenenti al JCF sono Le interface e le classi appartenenti al JCF sono definite “genericamente” rispetto al tipo di oggetto definite “genericamente” rispetto al tipo di oggetto contenuto in ciascuna specifica istanza di contenuto in ciascuna specifica istanza di Collection Collection

•• Tale tipo generico è specificato tra <> e viene detto Tale tipo generico è specificato tra <> e viene detto parametro di tipo o variabile di tipoparametro di tipo o variabile di tipo

•• La definizione di classi generiche (ossia con uno o La definizione di classi generiche (ossia con uno o più parametri di tipo) è una delle principali più parametri di tipo) è una delle principali innovazioni introdotte nella versione 1.5innovazioni introdotte nella versione 1.5

•• Essa è particolarmente adatta alle strutture dati ma Essa è particolarmente adatta alle strutture dati ma può essere utilizzata ovunque lo si ritenga utilepuò essere utilizzata ovunque lo si ritenga utile

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 36

Fondamenti di Programmazione

Confronto di stringhe Confronto di stringhe descrittivedescrittive

•• Si supponga di voler confrontare le stringhe Si supponga di voler confrontare le stringhe descrittive di oggetti descrittive di oggetti dello stesso tipodello stesso tipo in in questo modo: questo modo: –– se hanno una parte iniziale uguale (non vuota) se hanno una parte iniziale uguale (non vuota)

questa viene restituita in uscita questa viene restituita in uscita

–– in caso contrario viene restituito in caso contrario viene restituito null null

Fondamenti di Programmazione

Prima della 1.5 …Prima della 1.5 …

•• Poiché il metodo Poiché il metodo toString toString è definito nella classe è definito nella classe Object Object e il tipo e il tipo ObjectObject è compatibile con è compatibile con qualunque altro tipo, si potrebbe definire un qualunque altro tipo, si potrebbe definire un metodo di confronto che riceve in ingresso due metodo di confronto che riceve in ingresso due ObjectObject

String confrontaDescrizioniString confrontaDescrizioni((Object Object obj1,obj1,ObjectObject obj2)obj2)

•• . . . così però potrei finire per confrontare le . . . così però potrei finire per confrontare le pere con le mele (oggetti di tipo diverso) pere con le mele (oggetti di tipo diverso)

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 37

Fondamenti di Programmazione

La classe La classe Object Object come jollycome jolly

•• Prima della versione 1.5 la classe Prima della versione 1.5 la classe Object Object veniva veniva spesso usata come “jolly” per indicare “qualunque spesso usata come “jolly” per indicare “qualunque classe”classe”

•• Ad esempio tutte le strutture dati del JCF erano Ad esempio tutte le strutture dati del JCF erano definiti come contenitori di definiti come contenitori di ObjectObject, cosa che , cosa che permetteva di “mescolare” oggetti diversi nella permetteva di “mescolare” oggetti diversi nella stessa struttura . . .stessa struttura . . .

•• . . . ma obbligava a fare il cast esplicito per accedere . . . ma obbligava a fare il cast esplicito per accedere agli elementi contenuti secondo il loro “vero” tipo agli elementi contenuti secondo il loro “vero” tipo

Fondamenti di Programmazione

Due requisiti in conflitto ?Due requisiti in conflitto ?

•• Nella maggior parte dei casi non si desiderano Nella maggior parte dei casi non si desiderano strutture con contenuto eterogeneo, anzi la presenza strutture con contenuto eterogeneo, anzi la presenza di elementi eterogenei è indice di un errore e di elementi eterogenei è indice di un errore e potrebbe causare eccezioni al momento del castpotrebbe causare eccezioni al momento del cast

•• Tuttavia si desidera la definizione di strutture dati e Tuttavia si desidera la definizione di strutture dati e metodi generici, cioè in grado di operare su metodi generici, cioè in grado di operare su qualunque classe (altrimenti dovremmo definire una qualunque classe (altrimenti dovremmo definire una nuova classe contenitore per ogni nuova classe di nuova classe contenitore per ogni nuova classe di oggetto contenuto)oggetto contenuto)

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 38

Fondamenti di Programmazione

Due requisiti in conflitto ?Due requisiti in conflitto ?

•• Genericità: deve essere possibile definire Genericità: deve essere possibile definire classi generiche con capacità “universali” o classi generiche con capacità “universali” o comunque riferite ad un ampio insieme di comunque riferite ad un ampio insieme di classiclassi

•• Type safetyType safety: nell’ambito di classi generiche si : nell’ambito di classi generiche si vogliono evitare mescolanze indesiderate di vogliono evitare mescolanze indesiderate di tipi. Eventuali errori sui tipi devono essere tipi. Eventuali errori sui tipi devono essere rilevati al momento della compilazione rilevati al momento della compilazione anziché generare eccezioni in esecuzione.anziché generare eccezioni in esecuzione.

Fondamenti di Programmazione

Due requisiti in conflitto ?Due requisiti in conflitto ?

•• Nelle versioni precedenti alla 1.5 i due Nelle versioni precedenti alla 1.5 i due requisiti erano effettivamente in conflitto: per requisiti erano effettivamente in conflitto: per ottenere la genericità si usava ottenere la genericità si usava Object Object come come jolly, rinunciando così alla jolly, rinunciando così alla type safetytype safety

•• A partire dalla versione 1.5 si possono A partire dalla versione 1.5 si possono soddisfare entrambi i requisiti usando il soddisfare entrambi i requisiti usando il meccanismo delle classi generichemeccanismo delle classi generiche

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 39

Fondamenti di Programmazione

Una classe genericaUna classe generica

public class public class ComparatoreDescrizioni ComparatoreDescrizioni <T><T>{{private T obj1;private T obj1;private T obj2;private T obj2;

public public ComparatoreDescrizioniComparatoreDescrizioni(T _obj1, T _obj2)(T _obj1, T _obj2){{obj1 = _obj1;obj1 = _obj1;obj2 = _obj2;obj2 = _obj2;}}

public public void inizioComunevoid inizioComune()(){// DETTAGLI RIPORTATI IN SEGUITO MA NON RILEVANTI{// DETTAGLI RIPORTATI IN SEGUITO MA NON RILEVANTI}}

}}

La definizione della classe è parametrica rispetto ad un tipo T

La classe ha due attributi del tipo T

Il costruttore riceve due argomenti formali di tipo T

Fondamenti di Programmazione

Una classe genericaUna classe genericapublic public StringString inizioComuneinizioComune()(){ { StringString descr1 = obj1.descr1 = obj1.toStringtoString();();StringString descr2 = obj2.descr2 = obj2.toStringtoString();();int int i = 0;i = 0;StringBuffer parteUguale StringBuffer parteUguale = new = new StringBufferStringBuffer();();whilewhile (i < descr1.(i < descr1.lengthlength() && i < descr2.() && i < descr2.lengthlength() && () &&

descr1.descr1.charAtcharAt(i) == descr2.(i) == descr2.charAtcharAt(i))(i)){ { parteUgualeparteUguale..appendappend(descr1.(descr1.charAtcharAt(i));(i));i++;i++;}}

StringString inizio = inizio = parteUgualeparteUguale..toStringtoString();();ifif (inizio.(inizio.lengthlength() == 0)() == 0)return return nullnull;;

elseelsereturn inizio;return inizio;

}}

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 40

Fondamenti di Programmazione

Un Un main main che la utilizzache la utilizza

public class public class MainComparatoreString MainComparatoreString {{

public public static void mainstatic void main ((StringString[] [] argsargs)){{StringString s1 = s1 = MyUtilMyUtil..leggiStringleggiString("Inserire il primo termine");("Inserire il primo termine");StringString s2 = s2 = MyUtilMyUtil..leggiStringleggiString("Inserire il secondo termine");("Inserire il secondo termine");

ComparatoreDescrizioniComparatoreDescrizioni<<StringString> prova = > prova = new new ComparatoreDescrizioniComparatoreDescrizioni<<StringString>(s1,s2);>(s1,s2);

StringString risultato= prova.risultato= prova.inizioComuneinizioComune();();System.out.System.out.printlnprintln(risultato);(risultato);

}}

}}

Il tipo generico T viene sostituito da String in questo utilizzo

Se s1 ed s2 non fossero di tipo String si avrebbe errore in compilazione

Fondamenti di Programmazione

Un altro Un altro main main che la utilizzache la utilizza

public class public class MainComparatoreDatiPersonaliMainComparatoreDatiPersonali{{. . .. . .public public static void mainstatic void main ((StringString [] [] argsargs)){ { DatiPersonaliDatiPersonali dati1 = dati1 = creaDaticreaDati();();DatiPersonaliDatiPersonali dati2 = dati2 = creaDaticreaDati();();

ComparatoreDescrizioniComparatoreDescrizioni <<DatiPersonaliDatiPersonali> prova = > prova = new new ComparatoreDescrizioniComparatoreDescrizioni<<DatiPersonaliDatiPersonali> (dati1,dati2);> (dati1,dati2);

StringString risultato = prova.risultato = prova.inizioComuneinizioComune();();. . .. . .

}}. . .. . . Il tipo generico T viene sostituito

da DatiPersonali in questo utilizzo

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 41

Fondamenti di Programmazione

Classi generiche: Classi generiche: regole e convenzioniregole e convenzioni

•• La definizione di una classe generica è La definizione di una classe generica è parametrica rispetto ad uno o più parametri di parametrica rispetto ad uno o più parametri di tipo, indicati tra <> dopo il nome della classetipo, indicati tra <> dopo il nome della classe

•• Per convenzione i parametri di tipo vengono Per convenzione i parametri di tipo vengono indicati con singole lettere maiuscole: indicati con singole lettere maiuscole: T, S, U per qualunque usoT, S, U per qualunque usoE per indicare elementi di strutture collettiveE per indicare elementi di strutture collettiveK,V per indicare chiave e valore di K,V per indicare chiave e valore di MapMap

Fondamenti di Programmazione

Classi generiche: Classi generiche: regole e convenzioniregole e convenzioni

•• I nomi dei parametri di tipo possono essere I nomi dei parametri di tipo possono essere usati (quasi) come qualunque altro nome di usati (quasi) come qualunque altro nome di tipo nella definizione di una classe ma ci sono tipo nella definizione di una classe ma ci sono delle limitazioni:delle limitazioni:–– non è possibile creare istanze di tipi parametricinon è possibile creare istanze di tipi parametrici

(un’istruzione (un’istruzione new Tnew T non è possibile)non è possibile)

–– non è possibile definire attributi non è possibile definire attributi static static di un tipo di un tipo parametrico o usare un tipo parametrico parametrico o usare un tipo parametrico all’interno di metodi all’interno di metodi staticstatic

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 42

Fondamenti di Programmazione

Classi generiche: Classi generiche: regole e convenzioniregole e convenzioni

•• Al momento dell’uso ciascun parametro di Al momento dell’uso ciascun parametro di tipo generico deve essere sostituito con un tipo generico deve essere sostituito con un tipo strutturatotipo strutturato

•• I tipi elementari non sono utilizzabili a questo I tipi elementari non sono utilizzabili a questo scopo scopo

Fondamenti di Programmazione

Metodi genericiMetodi generici

•• In qualunque classe (generica o no) è In qualunque classe (generica o no) è possibile definire metodi generici, la cui possibile definire metodi generici, la cui definizione dipende da uno o più variabili di definizione dipende da uno o più variabili di tipo (riferite al solo metodo, non alla classe di tipo (riferite al solo metodo, non alla classe di cui fa parte)cui fa parte)

•• Le variabili di tipo sono specificate tra <> Le variabili di tipo sono specificate tra <> prima del tipo ritornatoprima del tipo ritornato

•• Esse devono comparire anche nella Esse devono comparire anche nella definizione del tipo di argomenti formalidefinizione del tipo di argomenti formali

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 43

Fondamenti di Programmazione

Metodi genericiMetodi generici

•• Se un metodo generico è definito in una Se un metodo generico è definito in una classe generica non bisogna far confusione classe generica non bisogna far confusione tra variabili di tipo del solo metodo e variabili tra variabili di tipo del solo metodo e variabili di tipo dell’intera classedi tipo dell’intera classe

•• Spesso i metodi generici sono Spesso i metodi generici sono static static e definiti e definiti in classi non generichein classi non generiche

•• Esempi di metodi generici Esempi di metodi generici static static sono presenti sono presenti nelle classi (non generiche) nelle classi (non generiche) Arrays Arrays e e CollectionsCollections

Fondamenti di Programmazione

Un esempio di metodo Un esempio di metodo generico (classe generico (classe ArraysArrays))

staticstatic <T> T[] <T> T[] copyOfcopyOf(T[] (T[] originaloriginal, , int newLengthint newLength))CopiesCopies the the specified arrayspecified array, , truncatingtruncating or or padding padding with nullswith nulls ((if necessaryif necessary) so the copy ) so the copy hashas the the specified lengthspecified length..

Il metodo copyOf è generico rispetto al tipo T

Il metodo restituisce un array di T

Il primo argomento formale del metodo è a sua volta un array di T

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 44

Fondamenti di Programmazione

Metodi genericiMetodi generici

•• L’invocazione di un metodo generico non L’invocazione di un metodo generico non richiede di specificare esplicitamente la richiede di specificare esplicitamente la sostituzione tra parametri di tipo e tipi sostituzione tra parametri di tipo e tipi effettivamente utilizzati: il compilatore effettivamente utilizzati: il compilatore riconosce la sostituzione dal passaggio dei riconosce la sostituzione dal passaggio dei parametri (parametri (purchèpurchè compatibile con la compatibile con la definizione)definizione)

•• Anche per i metodi generici non è possibile Anche per i metodi generici non è possibile utilizzare tipi elementari come sostituti di utilizzare tipi elementari come sostituti di parametri di tipoparametri di tipo

Fondamenti di Programmazione

Vincoli sui parametri di tipoVincoli sui parametri di tipo

•• In alcuni casi non si vuole che una classe In alcuni casi non si vuole che una classe generica sia “universale” (cioè che ciascun generica sia “universale” (cioè che ciascun parametro di tipo sia sostituibile da parametro di tipo sia sostituibile da qualunque tipo strutturato): il tipo generico qualunque tipo strutturato): il tipo generico può essere vincolato a rispettare delle può essere vincolato a rispettare delle caratteristichecaratteristiche

•• I vincoli specificabili sono legati alle relazioni I vincoli specificabili sono legati alle relazioni di ereditarietàdi ereditarietà

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 45

Fondamenti di Programmazione

Vincolo Vincolo extendsextends

•• Si può imporre al tipo generico di essere Si può imporre al tipo generico di essere derivato da una certa classe o interfacederivato da una certa classe o interface

•• In questo modo qualunque tipo sostituito In questo modo qualunque tipo sostituito avrà delle caratteristiche comuni garantite avrà delle caratteristiche comuni garantite sulle quali la definizione della classe generica sulle quali la definizione della classe generica può fare affidamentopuò fare affidamento

•• Il vincolo viene espresso tra le <> usando la Il vincolo viene espresso tra le <> usando la parola chiave parola chiave extendsextends p.e.p.e.<T <T extends Comparableextends Comparable>>

Fondamenti di Programmazione

Vincolo superVincolo super

•• In modo analogo è possibile imporre il vincolo In modo analogo è possibile imporre il vincolo di essere superclasse di un tipo specificatodi essere superclasse di un tipo specificato

•• Il vincolo è espresso usando la parola chiave Il vincolo è espresso usando la parola chiave supersuper tra <> tra <>

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 46

Fondamenti di Programmazione

Il carattere “jolly” (Il carattere “jolly” (wildcardwildcard))

•• Il carattere ? all’interno di <> rappresenta Il carattere ? all’interno di <> rappresenta l’indicazione jolly di “qualunque tipo”l’indicazione jolly di “qualunque tipo”

•• Esso è utilizzabile in combinazione con i Esso è utilizzabile in combinazione con i vincoli vincoli extends extends o super o da soloo super o da solo

•• Se usato da solo esso indica una sostituzione Se usato da solo esso indica una sostituzione totalmente libera (che però potrebbe essere totalmente libera (che però potrebbe essere vincolata indirettamente da altre parti della vincolata indirettamente da altre parti della definizione della classe o del metodo)definizione della classe o del metodo)

Fondamenti di Programmazione

Esempi di vincoli e jollyEsempi di vincoli e jolly

static <T> void copy(List<? super T> dest, List<? extends T> src)Copies all of the elements from one list into another.

Il metodo copy (classe Collections) è generico rispetto al tipo T

Esso riceve come argomenti una List “sorgente” src da cui copiare gli elementi e una List “destinazione” dest dove metterli.Poiché List è un’interface generica va specificato il tipo contenuto di entrambe

La List sorgente deve contenere elementi di una sottoclasse di T

La List destinazione deve contenere elementi di una superclasse di T

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 47

Fondamenti di Programmazione

Esempi di vincoli e jollyEsempi di vincoli e jolly

boolean addAllboolean addAll((CollectionCollection<? <? extendsextends E> c) E> c) Adds allAdds all of the of the elementselements in the in the specified collection to specified collection to this collectionthis collection (optional (optional operationoperation).).

Il metodo addAll è definito nell’interface Collection che è parametrica rispetto al tipo E dei suoi elementi (qui richiamato)

Esso riceve come argomento una Collection c da cui “pescare” gli elementi da aggiungere

La Collection c deve contenere elementi di una sottoclasse di E

Fondamenti di Programmazione

Esempi di vincoli e jollyEsempi di vincoli e jolly

boolean containsAllboolean containsAll((CollectionCollection<?> c) <?> c) Returns true if this collection contains allReturns true if this collection contains all of the of the elementselements in the in the specified collectionspecified collection..

Il metodo containsAll è definito nell’interface Collection che è parametrica rispetto al tipo E dei suoi elementi (qui non richiamato)

Esso riceve come argomento una Collection c da cui “pescare” gli elementi di cui verificare la presenza

La Collection c può contenere elementi di qualunque classe

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 48

Fondamenti di Programmazione

RoadmapRoadmap•• 13. Strutture dati + 13. Strutture dati + GenericsGenerics

Tipi di dati parametriciTipi di dati parametrici

Le interface Le interface CollectionCollection, , IterableIterable, , IteratorIterator

Famiglie di Famiglie di CollectionCollection: Set, List, : Set, List, QueueQueue, , DequeDeque

La nozione di La nozione di StackStack

L’interface L’interface MapMap

Dalle interface alle classiDalle interface alle classi

Guardando dentro: classi e interface genericheGuardando dentro: classi e interface generiche

Esempi di programmazione di strutture dati “classiche”: Esempi di programmazione di strutture dati “classiche”: liste concatenate e alberi binariliste concatenate e alberi binari

Fondamenti di Programmazione

Liste concatenateListe concatenate

•• Si parla di lista concatenata per indicare una Si parla di lista concatenata per indicare una struttura nella quale gli elementi (detti anche struttura nella quale gli elementi (detti anche nodi) sono collegati tramite riferimenti nodi) sono collegati tramite riferimenti dall’uno all’altrodall’uno all’altro

•• Il caso più semplice di lista concatenata Il caso più semplice di lista concatenata prevede un collegamento unidirezionale prevede un collegamento unidirezionale sequenziale a partire da un elemento inizialesequenziale a partire da un elemento iniziale

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 49

Fondamenti di Programmazione

Lista concatenata sempliceLista concatenata sempliceIl primo elemento viene detto “testa” della lista ed è riferito da una variabile che non è un elemento della listaQuesto riferimento è necessario per accedere alla lista

Ogni elemento, tranne l’ultimo, riferisce l’elemento successivo

Fondamenti di Programmazione

Lista concatenata doppiaLista concatenata doppia

Ogni elemento contiene due riferimenti (uno all’elemento successivo, uno al precedente)Il primo elemento contiene solo il riferimento al successivo, l’ultimo elemento solo al precedente

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 50

Fondamenti di Programmazione

Lista circolare sempliceLista circolare semplice

L’ultimo elemento è collegato al primo in modo da chiudere circolarmente il collegamento. Le nozioni di primo e ultimo elemento non sono più essenziali. Rimane la necessità di un riferimento esterno dal quale partire

Fondamenti di Programmazione

Lista circolare doppiaLista circolare doppia

I riferimenti tra gli elementi realizzano un doppio anello

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 51

Fondamenti di Programmazione

Doppio riferimentoDoppio riferimentoIn tutte le varianti, oltre che il riferimento alla testa si può mantenere il riferimento anche all’ultimo elemento (coda) della lista

Fondamenti di Programmazione

Strutture dati Strutture dati ricorsivericorsive

•• Gli elementi di strutture dati concatenate sono Gli elementi di strutture dati concatenate sono tipicamente definiti in modo tipicamente definiti in modo ricorsivoricorsivo: infatti ogni : infatti ogni elemento deve contenere un riferimento ad un elemento elemento deve contenere un riferimento ad un elemento dello stesso tipodello stesso tipo

class class NodoLista NodoLista {{

private private NodoListaNodoLista prossimo;prossimo;. . .. . .

}}

class class NodoListaDoppia NodoListaDoppia {{

private private NodoListaDoppiaNodoListaDoppia prossimo;prossimo;private private NodoListaDoppiaNodoListaDoppia precedente;precedente;. . .. . .

}}

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 52

Fondamenti di Programmazione

Generics Generics e classi internee classi interne

•• Per rappresentare una struttura dati sono tipicamente Per rappresentare una struttura dati sono tipicamente necessarie almeno due classi: una che rappresenta la necessarie almeno due classi: una che rappresenta la struttura (p.e. la lista) “nel suo complesso” e una per struttura (p.e. la lista) “nel suo complesso” e una per rappresentare i singoli elementi della listarappresentare i singoli elementi della lista

•• Per definire strutture parametriche rispetto ai dati Per definire strutture parametriche rispetto ai dati contenuti negli elementi entrambe le classi devono essere contenuti negli elementi entrambe le classi devono essere generiche (p.e. Lista<E>, generiche (p.e. Lista<E>, ElementoListaElementoLista<E>)<E>)

•• Si vuole però specificare che il tipo di una lista e dei suoi Si vuole però specificare che il tipo di una lista e dei suoi elementi deve essere lo stesso. Questo non è possibile se elementi deve essere lo stesso. Questo non è possibile se le due classi sono definite separatamente: bisogna invece le due classi sono definite separatamente: bisogna invece definire una classe internamente all’altra (definire una classe internamente all’altra (inner inner class)class)

Fondamenti di Programmazione

Classi interneClassi interne

•• E’ possibile definire una classe all’interno di un’altraE’ possibile definire una classe all’interno di un’altra

•• La classe interna non può essere public e La classe interna non può essere public e tipicamente sarà private (il suo uso è limitato alla tipicamente sarà private (il suo uso è limitato alla classe che la contiene)classe che la contiene)

•• L’uso di classi interne (che non verrà approfondito) è L’uso di classi interne (che non verrà approfondito) è utile in situazioni molto specificheutile in situazioni molto specifiche

•• Una di queste è la condivisione di una variabile di Una di queste è la condivisione di una variabile di tipo: la classe interna sarà definita in termini della tipo: la classe interna sarà definita in termini della variabile di tipo della classe esternavariabile di tipo della classe esterna

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 53

Fondamenti di Programmazione

Classi Lista e Classi Lista e NodoListaNodoLista

public class Lista<E>public class Lista<E>{{private private NodoLista NodoLista testa;testa;private private int numeroElementiint numeroElementi;;

. . .// METODI VARI DI Lista da approfondire dopo. . .// METODI VARI DI Lista da approfondire dopo

private class private class NodoListaNodoLista{{private E contenuto;private E contenuto;private private NodoLista NodoLista prossimo;prossimo;. . .// METODI DI . . .// METODI DI NodoListaNodoLista da approfondire dopoda approfondire dopo

}}

}}

La classe Lista è parametrica rispetto ad un tipo E

In caso di lista semplice è sufficiente il solo attributo testa che riferisce il primo elemento della lista

La classe NodoLista è interna a Lista. Essa non è esplicitamente generica ma la sua definizione può contenere la variabile di tipo E della classe esterna.

La classe e i suoi attributi sono private, ma visibili all’interno della classe Lista

Fondamenti di Programmazione

La classe La classe NodoListaNodoLista

private class private class NodoListaNodoLista{{private E contenuto;private E contenuto;private private NodoListaNodoLista prossimo;prossimo;

public public NodoLista NodoLista (E _contenuto)(E _contenuto){{contenuto = _contenuto;contenuto = _contenuto;prossimo = prossimo = nullnull;;} }

public public NodoListaNodoLista (E _contenuto, (E _contenuto, NodoListaNodoLista _prossimo)_prossimo){{contenuto = _contenuto;contenuto = _contenuto;prossimo = _prossimo;prossimo = _prossimo;} }

}}

La classe NodoLista ha due semplici costruttori: - uno per quando non c’è un elemento successivo- uno per quando c’è

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 54

Fondamenti di Programmazione

La classe La classe NodoListaNodoLista

private class private class NodoListaNodoLista{. . .{. . .public public String toStringString toString()(){{return contenuto.return contenuto.toStringtoString();();} }

}}La stringa descrittiva di un nodo coincide con la stringa descrittiva del suo contenuto

Fondamenti di Programmazione

La classe Lista: costruttoriLa classe Lista: costruttori

public class Lista<E>public class Lista<E>{{

private private NodoListaNodoLista testa;testa;private private int numeroElementiint numeroElementi;;

public Lista()public Lista(){{testa = testa = nullnull;;numeroElementinumeroElementi=0;=0;

}}

public Lista(E public Lista(E primoElementoprimoElemento)){{testa = new testa = new NodoListaNodoLista((primoElementoprimoElemento););numeroElementinumeroElementi=1;=1;

}}

. . .. . .}}

La classe Lista ha due semplici costruttori: - uno creare una lista vuota, priva di elementi- uno per quando il primo elemento è specificato

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 55

Fondamenti di Programmazione

La classe Lista: La classe Lista: metodi di utilitàmetodi di utilità

public class Lista<E>public class Lista<E>{ . . .{ . . .public public boolean isEmptyboolean isEmpty()(){{return testa == return testa == nullnull;;}}

public public String toStringString toString()(){{ifif ((isEmptyisEmpty()) ()) {{return MESS_VUOTA;return MESS_VUOTA;}}elseelse{{StringBufferStringBuffer risultato = new risultato = new StringBufferStringBuffer();();NodoListaNodoLista corrente = testa;corrente = testa;whilewhile (corrente != (corrente != nullnull) ) {{risultato.risultato.appendappend(corrente.(corrente.toStringtoString() + "() + "\\n");n");corrente = corrente.prossimo;corrente = corrente.prossimo;}}return risultato.return risultato.toStringtoString();();}}

}}

La lista è vuota se il primo riferimento è null

All’interno del metodo toString si ha il tipico modo di scorrere tutti gli elementi di una lista semplice

Viene fissato un riferimento all’inizio della listaLa scansione termina quando il riferimento diventa null

L’avanzata avviene passando al prossimo elemento

Fondamenti di Programmazione

Scansione di una listaScansione di una listatesta

next

contenuto

next

contenuto

next

contenuto

next

contenuto

next=null

contenuto

corrente

null

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 56

Fondamenti di Programmazione

Inserimento in testaInserimento in testa

public public void inserimentoInTestavoid inserimentoInTesta(E contenuto)(E contenuto){{numeroElementinumeroElementi++;++;ifif ((isEmptyisEmpty())())testa = new testa = new NodoListaNodoLista(contenuto);(contenuto);

else else testa = new testa = new NodoListaNodoLista(contenuto, testa);(contenuto, testa);

}}

Il numero di elementi cresce e il nuovo NodoLista sarà riferito da testa in ogni caso

Se la lista è vuota, il nuovo nodo è anche l’unico e avrà null come successore

Altrimenti avrà come successore quello che prima era in testa

Fondamenti di Programmazione

Inserimento in codaInserimento in coda

public public void inserimentoInCodavoid inserimentoInCoda(E contenuto)(E contenuto){{numeroElementinumeroElementi++;++;ifif ((isEmptyisEmpty())())testa = new testa = new NodoListaNodoLista(contenuto);(contenuto);else else {{NodoLista NodoLista corrente = testa;corrente = testa;whilewhile(corrente.prossimo != (corrente.prossimo != nullnull))

corrente=corrente.prossimo;corrente=corrente.prossimo;

corrente.prossimo=new corrente.prossimo=new NodoListaNodoLista(contenuto);(contenuto);}}

}}

Si porta il riferimento corrente all’ultimo elemento

. . . e si aggiunge lì il nuovo nodo

Se la lista è vuota, testa e coda coincidono

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 57

Fondamenti di Programmazione

Inserimento in una posizioneInserimento in una posizionepublic public void void inserimento(inserimento(intint posizione, E contenuto) posizione, E contenuto) throws throws

ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException{{ifif (posizione < 0 || posizione > (posizione < 0 || posizione > numeroElementinumeroElementi))throw throw new new ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException();();

ifif (posizione == 0)(posizione == 0)inserimentoInTestainserimentoInTesta(contenuto);(contenuto);

elseelseifif (posizione == (posizione == numeroElementinumeroElementi))inserimentoInCodainserimentoInCoda(contenuto); (contenuto);

else else {{NodoListaNodoLista corrente = testa;corrente = testa;for for ((int int i=1; i < posizione; i++)i=1; i < posizione; i++)

corrente=corrente.prossimo;corrente=corrente.prossimo;

corrente.prossimo=new corrente.prossimo=new NodoListaNodoLista(contenuto,corrente.prossimo);(contenuto,corrente.prossimo);}}

numeroElementinumeroElementi++;++;}}

Controllo che la posizione sia valida

Sappiamo già gestire le posizioni estreme

Si porta il riferimento corrente all’elemento in posizione precedente a quello nuovo

… e si aggiunge lì il nuovo nodo

Fondamenti di Programmazione

Rimozione in testaRimozione in testa

public E public E rimozioneInTestarimozioneInTesta() () throws throws NoSuchElementExceptionNoSuchElementException

{{ifif ((isEmptyisEmpty())())throw throw new new NoSuchElementExceptionNoSuchElementException();();

E risultato = testa.contenuto;E risultato = testa.contenuto;testa=testa.prossimo;testa=testa.prossimo;

numeroElementinumeroElementi----;;return risultato;return risultato;}}

Metto via il risultato

Controllo che ci sia almeno un elemento da togliere

Spostando avanti il riferimento ottengo un’eliminazione implicita

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 58

Fondamenti di Programmazione

Rimozione in codaRimozione in codapublic E public E rimozioneInCodarimozioneInCoda()()throws NoSuchElementExceptionthrows NoSuchElementException{{

ifif ((isEmptyisEmpty())())throw throw new new NoSuchElementExceptionNoSuchElementException();();

if if ((numeroElementi numeroElementi == 1)== 1)return return rimozioneInTestarimozioneInTesta();();elseelse{{NodoListaNodoLista corrente = testa;corrente = testa;forfor ((intint i=1; i < i=1; i < numeroElementinumeroElementi--1; i++)1; i++)

corrente=corrente.prossimo;corrente=corrente.prossimo;E risultato = corrente.prossimo.contenuto;E risultato = corrente.prossimo.contenuto;corrente.prossimo = corrente.prossimo = nullnull;;numeroElementinumeroElementi----;;return risultato;return risultato;}}

}}

Se l’elemento è uno solo so già come fare

Controllo che ci sia almeno un elemento da togliere

Porto il riferimento corrente sul penultimo elemento

Metto via il risultato

Mettendo a null il riferimento ottengo un’eliminazione implicita

Fondamenti di Programmazione

Rimozione in una posizioneRimozione in una posizionepublic E rimozione (public E rimozione (intint posizione) posizione) throws throws

ArrayIndexOutOfBoundsException ArrayIndexOutOfBoundsException {{ifif (posizione < 0 || posizione > (posizione < 0 || posizione > numeroElementinumeroElementi--1)1)throw throw new new ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException();();

ifif (posizione == 0)(posizione == 0)return return rimozioneInTestarimozioneInTesta();();

elseelseifif (posizione == (posizione == numeroElementinumeroElementi--1)1)return return rimozioneInCodarimozioneInCoda(); ();

else else {{NodoListaNodoLista corrente = testa;corrente = testa;for for ((int int i=1; i < posizione; i++)i=1; i < posizione; i++)

corrente=corrente.prossimo;corrente=corrente.prossimo;

E risultato = corrente.prossimo.contenuto;E risultato = corrente.prossimo.contenuto;corrente.prossimo=corrente.prossimo.prossimo; corrente.prossimo=corrente.prossimo.prossimo; numeroElementinumeroElementi----;;return risultato;return risultato;

}}}}

Controllo che la posizione sia valida

Sappiamo già gestire le posizioni estreme

Si porta il riferimento corrente all’elemento in posizione precedente a quello da eliminare

L’eliminazione si ottiene con uno scavalcamento

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 59

Fondamenti di Programmazione

Alberi binariAlberi binari

•• Un albero binario è un albero con la Un albero binario è un albero con la caratteristica che ogni nodo può avere al più caratteristica che ogni nodo può avere al più due figlidue figli

•• Gli alberi binari (in forme più sofisticate di Gli alberi binari (in forme più sofisticate di quella elementare che vedremo noi) sono quella elementare che vedremo noi) sono molto utilizzati per la gestione di dati dotati di molto utilizzati per la gestione di dati dotati di ordinamento, in quanto consentono ordinamento, in quanto consentono l’effettuazione efficiente di operazioni di l’effettuazione efficiente di operazioni di inserimento e ricercainserimento e ricerca

Fondamenti di Programmazione

Albero binarioAlbero binario

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 60

Fondamenti di Programmazione

Albero binarioAlbero binario

E

C

A

O

R

PB

G

U

CA

A

OR

R

P

P

P

B

B

B

G

G

U

U

U

Fondamenti di Programmazione

Le classi Le classi BTreeBTree e e TreeNodeTreeNode

public class public class BTreeBTree <E <E extendsextends ComparableComparable<? super E>><? super E>>{{

private private TreeNode rootTreeNode root;;

. . .. . .private class private class TreeNodeTreeNode{{private E private E valuevalue;;private private TreeNode leftTreeNode left;;private private TreeNode rightTreeNode right;;. . .. . .

}}

La classe BTree è generica rispetto ad un tipo E che deve estendere l’interfaceComparable (deve essere possibile stabilire tra due elementi quale viene prima)

Poiché l’interface Comparable è a sua volta generica, si specifica il relativo tipo. In pratica si indica che E può estendere Comparable direttamente o anche ereditandola da una superclasse

Analogamente al caso precedente, la classe BTree ha un solo attributo per riferire la radice dell’albero e contiene come classe interna quella relativa ai nodi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 61

Fondamenti di Programmazione

La classe La classe BTreeBTreepublic class public class BTreeBTree <E <E extendsextends ComparableComparable<? super E>><? super E>>{{private private TreeNode rootTreeNode root;;

public public BTreeBTree() () { { rootroot = = nullnull; ; }}

public public void insertNodevoid insertNode(E(E newElementnewElement)){{ifif ( ( rootroot == == nullnull ))rootroot = new = new TreeNodeTreeNode((newElementnewElement););elseelserootroot..insertinsert((newElementnewElement););

}}

L’albero viene costruito inizialmente vuoto

Per l’inserimento di un nodo:- se l’albero è vuoto si crea semplicemente la radice- altrimenti si invoca sulla radice un metodo di inserimento della classe TreeNode

Fondamenti di Programmazione

La classe La classe TreeNodeTreeNodeprivate class private class TreeNodeTreeNode{{private E private E valuevalue;;private private TreeNode leftTreeNode left;;private private TreeNode rightTreeNode right;;

public public TreeNode TreeNode (E _(E _valuevalue)){{value value = _= _valuevalue;;left left = = nullnull;;right right = = nullnull; ; }}

public public String toStringString toString()(){{return return valuevalue..toStringtoString();();} }

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 62

Fondamenti di Programmazione

Metodo di inserimento Metodo di inserimento "ordinato" in "ordinato" in TreeNodeTreeNode

public public void insertvoid insert(E (E newElementnewElement)){{ifif ((newElementnewElement..compareTocompareTo((valuevalue) < 0) ) < 0) {{ifif ((leftleft == == nullnull))leftleft = new = new TreeNodeTreeNode((newElementnewElement););elseelseleftleft..insertinsert((newElementnewElement););

}}else else ifif ((newElementnewElement..compareTocompareTo((valuevalue) > 0) ) > 0) {{ifif ((rightright == == nullnull) ) rightright = new = new TreeNodeTreeNode((newElementnewElement););elseelserightright..insertinsert( ( newElementnewElement ););

}}}}

Il nuovo elemento è minore del valore di questo nodo: si va a sinistraSe a sinistra non c’è nulla, si crea lì un nuovo nodo

Altrimenti si invoca ricorsivamente il metodo sul figlio di sinistra

Il caso di elemento maggiore è del tutto analogo

Se newElement è un doppione, viene ignorato

Fondamenti di Programmazione

Ricerca di un elemento Ricerca di un elemento (nella classe (nella classe BTreeBTree))

public public boolean binarySearchboolean binarySearch(E (E toFindtoFind) ) { { return return searchHelpersearchHelper((rootroot, , toFindtoFind); ); }}

private private boolean searchHelperboolean searchHelper((TreeNode nodeTreeNode node, E , E wantedwanted)){{ifif ((nodenode == == nullnull) return false;) return false;

ifif ((wantedwanted..compareTocompareTo((nodenode..valuevalue) == 0) ) == 0) return return truetrue;;

ifif ((wantedwanted..compareTocompareTo((nodenode..valuevalue) < 0)) < 0)return return searchHelpersearchHelper((nodenode..leftleft, , wantedwanted););elseelsereturn return searchHelpersearchHelper((nodenode..rightright, , wantedwanted););

}}

Il metodo di ricerca pubblico si avvale di un metodo ricorsivo privato

Se nella ricerca si arriva a null, l’elemento cercato non è presente

Qui abbiamo trovato l’elemento

La ricerca, se non è terminata, prosegue ricorsivamente a sinistra o a destra

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 63

Fondamenti di Programmazione

Traversata in ordineTraversata in ordine

public public void inOrderTraversalvoid inOrderTraversal() () { { inOrderHelperinOrderHelper((rootroot); ); }}

private private void inOrderHelpervoid inOrderHelper((TreeNode nodeTreeNode node)){{ifif ((nodenode == == nullnull))return;return;

inOrderHelperinOrderHelper((nodenode..leftleft););System.out.System.out.printlnprintln((nodenode..toStringtoString()); ());

//o qualunque altra operazione//o qualunque altra operazioneinOrderHelperinOrderHelper((nodenode..rightright););}}

Fondamenti di Programmazione

Traversata in Traversata in preordinepreordine

public public void preOrderTraversalvoid preOrderTraversal() () { { preOrderHelperpreOrderHelper((rootroot); ); }}

private private void preOrderHelpervoid preOrderHelper((TreeNode nodeTreeNode node)){{ifif ((nodenode == == nullnull))return;return;

System.out.System.out.printlnprintln((nodenode..toStringtoString()); ()); //o qualunque altra operazione//o qualunque altra operazione

preOrderHelperpreOrderHelper((nodenode..leftleft););preOrderHelperpreOrderHelper((nodenode..rightright););}}

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Strutture dati + Generics 64

Fondamenti di Programmazione

Traversata in Traversata in postordinepostordine

public public void postOrderTraversalvoid postOrderTraversal() () { { postOrderHelperpostOrderHelper((rootroot); ); }}

private private void postOrderHelpervoid postOrderHelper((TreeNode nodeTreeNode node)){{ifif ((nodenode == == nullnull))return;return;

postOrderHelperpostOrderHelper((nodenode..leftleft););postOrderHelperpostOrderHelper((nodenode..rightright););System.out.System.out.printlnprintln((nodenode..toStringtoString()); ());

//o qualunque altra operazione//o qualunque altra operazione}}