Le collezioni di oggetti. Prof. Accarino IIS Altiero Spinelli via Leopardi 132 Sesto San Giovanni

Documenti analoghi
Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Generics & Collections

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Le Collezioni (Java Collections)

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Corso di Algoritmi e Strutture Dati con Laboratorio. Tipi di dato pila e coda

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011

Introduzione al Java Collections Framework. Java Collections Framework (cont.) Interfacce del Collections Framework

Introduzione al Java Collections Framework

Sul pattern Iterator

Metodi di una Collection

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Il linguaggio Java: aggiunte in Java 1.5

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Collezioni. (a cura del Prof. Marco Patella)

Fondamenti di informatica Oggetti e Java. Luca Cabibbo. Collezioni++ (Aggiunte di Marco Patella) Capitolo 26.bis. aprile 2006.

Notazione grafica UML

22 - Strutture Dati (Java Collections Framework)

Corso di Algoritmi e Strutture Dati con Laboratorio. Java Collections Framework (I parte)

La struttura dati CODA

Capitolo 14 Introduzione alle strutture di dati. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Testo di Riferimento (usato nei corsi precedenti)

Il Java Collections Framework

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Algoritmi di Ricerca. Esempi di programmi Java

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Funzioni, Stack e Visibilità delle Variabili in C

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Algoritmi e Strutture Dati

Il linguaggio C. Puntatori e dintorni

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

Capitolo 17. Introduzione alle strutture di dati. Capitolo 17 Introduzione alle strutture di dati

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

ADT Mappa. Le chiavi (il mezzo per accedere agli elementi) hanno lo scopo di rendere efficiente la ricerca. Strutture Dati

Indice generale Introduzione...vii Parte I Concetti e costrutti fondamentali... 1 Capitolo 1 Introduzione al linguaggio... 3

Bank. Bank. BankAccount. Bank. Bank. private BankAccount[] conti; // Posizione attuale private int posizioneattuale;...

Algoritmi di Ricerca. Esempi di programmi Java

CORSO DI PROGRAMMAZIONE

La classe std::vector della Standard Template Library del C++

Cosa sono i Generics?

ADT Dizionario. Come nella Mappa: Diversamente dalla Mappa:

Implementazione Java di un ADT

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

CORSO DI PROGRAMMAZIONE

Sommario. Collezioni. Collezioni: Liste: Pile (stack) Collezioni. Collezioni. Collezioni Struttura indicizzata (array) Nodi

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Lezione 6 programmazione in Java

se invoco un metodo di Object che è ridefinito in Point, viene invocato il metodo definito in Point

Programmazione ad oggetti

Richiami di Fondamenti di Informatica - 1

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

14 - Metodi e Costruttori

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

Calcolare x n = x x x (n volte)

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

COLLEZIONI. SOMMARIO Collezioni: Liste: ITERATORI ITERATORI

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Polimorfismo parametrico vs polimorfismo per inclusione

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Fondamenti di Informatica L-B Esercitazione n 6 Java: Collezioni, Classe Wrapper & Generics

Programmazione = decomposizione basata su astrazioni

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Pile: implementazione. Pile: implementazione. Pile: implementazione con array. Pile: implementazione con array. Pile: implementazione con array

Metodologie di Programmazione. ovvero, Principi e Tecniche per la costruzione di programmi

IL CONCETTO DI CLASSE

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

INTRODUZIONE INTRODUZIONE TABELLE HASH FUNZIONE HASH

Client - Interfaccia - Implementazione

Il tipo astratto di dati Node List

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

TIPI PRIMITIVI E CLASSI WRAPPER

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Implementazione ADT: Alberi

Programmazione con Java

Strutture dati e loro organizzazione. Gabriella Trucco

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Fondamenti di Informatica II

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Partiamo da un esempio: voglio realizzare un sw per la gestione dei miei contatti personali

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Classe Vettore (i) Creare una classe che consenta di gestire un vettore di N elementi reali (double), che preveda i seguenti metodi:

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Transcript:

Le collezioni di oggetti Prof. Accarino IIS Altiero Spinelli via Leopardi 132 Sesto San Giovanni

Contenitori di oggetti Java mette a disposizione una libreria per gestire gruppi di oggetti organizzandola in due tipologie: Collection: una raccolta sequenziale di singoli elementi ai quali sono applicate una o più regole (List, Set, Queue) Map: un gruppo di coppie chiave-valore indicanti oggetti, permettendo di recuperare un valore mediante la chiave ad esso associata La distinzione si basa sul numero degli elementi contenuti in ciascuna posizione del contenitore

Collection Una Collection è un oggetto che raggruppa elementi multipli in una singola unità Viene utilizzata per memorizzare, recuperare e manipolare dati, per trasmetterli da un metodo ad un altro Tipicamente rappresentano dati correlati tra loro, come una collezione di numeri telefonici, collezione di lettere, etc. Sono state introdotte a partire dalla release 1.2 (collection framework)

Collection Framework Il framework dei contenitori è composto da: Interfacce: Tipi di dato astratti che rappresentano le classi contenitori Permettono di manipolare i contenitori indipendentemente dai dettagli della rappresentazione In genere formano una gerarchia Implementazioni: Implementazioni concrete delle interfacce Sono le strutture dati riusabili Algoritmi Metodi che effettuano delle computazioni sui contenitori, come ad esempio ordinamento, ricerca, Gli algoritmi sono polimorfici poiché gli stessi metodi possono essere applicati a differenti implementazioni Sono le funzionalità riusabili

Gerarchia di collection FrameWork

Interfacce Set List Collezione che non può contenere duplicati Astrazione dell insieme matematico Collezione ordinata (detta anche sequenza) Può contenere elementi duplicati Si accede agli elementi mediante un indice intero (posizione) Queue Rappresenta una coda di elementi,l'approccio è rivolto a risolvere problemi di sincronizzazione di programmi concorrenti e il loro studio esula da questo contesto

Interfacce SortedSet Insieme dove gli elementi sono ordinati in ordine ascendente Operazioni aggiuntive per utilizzare l ordinamento Deque (double ended queue) Coda che permette l inserimento e la rimozione di elementi sia in testa che in coda

Utilizzo di Collection non parametrizzate Le collection in Java contengono oggetti di tipo Object e E necessario effettuare un casting quando si recupera l oggetto E possibile contenere tipi eterogenei Non è possibile inserire valori di tipi primitivi Esempio: E necessario utilizzare tipi wrapper: Integer, Long ecc. ArrayList al= new ArrayList(); al.add( Pippo ); al.add(new Integer(5)); String s=(string)al.get(0); Integer numero = (Integer)dati.get(0); int n = numero.intvalue();

Svantaggi nell utilizzo di liste non Parametrizzate Uno svantaggio tipico è la perdita di informazione sul tipo quando si inseriscono oggetti nel contenitore. Infatti: poiché non vi sono restrizioni sul tipo di oggetti inseribili nel contenitore, è possibile inserire senza problemi cani in una collezione di gatti (fonte di potenziali errori) a causa della perdita del tipo, occorre eseguire una forzatura (cast) corretta, a run time, all atto dell estrazione dell oggetto per non incorrere in un eccezione

Esempio: class Gatto { // costruttore public Gatto(int i) // restituisce l identificativo unico public int getid() } public class Cane { // costruttore public Cane(int i) // restituisce l identificativo unico public int getid() } import java.util.*; public class CaniEGatti { } { } public static void main(string[] args) List gatti = new ArrayList(); for(int i = 0; i < 7; i++) gatti.add(new Gatto(i)); gatti.add(new Cane(7)); /* Eccezione rilevata a run time */ for(int i = 0; i < gatti.size(); i++) ((Gatto)gatti.get(i)).id();

Parametrizzare la lista Per ovviare ai problemi precedenti è lecito definire una nuova classe lista parametrizzata List<Gatto> gatti = new ArrayList<Gatto>(); List<Cane> cani = new ArrayList<Cane>(); for (int i = 0; i < 7; i++) // aggiungi gatti.add(new Gatto(i)); for (int i = 0; i < 3; i++) // aggiungi cani.add(new Cane(i));

Vantaggi nell uso di generici I principali vantaggi dovuti all introduzione dei tipi generici sono: Il compilatore può verificare qualsiasi operazione add di oggetti alla collezione il tipo dell oggetto estratto da una collezione è noto, quindi non vi è la necessità di operare un cast a un tipo diverso (fonte di potenziali errori se il cast è fatto su tipi non omologhi)

Implementazioni di Vettori Le classi java.util.vector e java.util.arraylist definiscono degli oggetti, chiamati vettori, che consentono di rappresentare sequenze di oggetti di lunghezza variabile. Ciascun oggetto in un vettore ha un numero intero, detto indice, che ne indica la posizione nel vettore. Grazie all'indice è possibile accedere indipendentemente a ciascun elemento della sequenza. L'accesso ad una posizione inesistente provoca un errore (viene lanciata un'eccezione). Al momento della dichiarazione o creazione di un vettore, il tipo base degli elementi del vettore va indicato tra parentesi angolate dopo il nome della classe (Vector e ArrayList sono classi generiche). Ad esempio, per costruire un vettore di stringhe (inizialmente vuoto) e assegnarlo alla variabile vet, scriveremo: ArrayList<String> vet = new ArrayList<String>();

Implementazioni di Vettori I vettori sono dunque simili agli array. Le differenze principali sono due: la dimensione di un vettore può variare durante l'esecuzione di un programma; il tipo base di un vettore NON può essere un tipo primitivo (int, double,...). L'implementazione dei vettori è basata sugli array. Al momento della creazione di un vettore, alla variabile di istanza elementdata viene assegnato un array di oggetti la cui dimensione dipende dal costruttore utilizzato: String[ ] elementdata = new String[initialCapacity]; Successivamente, se la capacità dell array non è più sufficiente, viene creato un nuovo array più grande nel quale vengono copiati tutti gli elementi del vecchio.

Realizzazione in memoria di Vettori

Differenze tra Vector e ArrayList Nel seguito, usando la sintassi Java 6.0, indicheremo con Vector<E> e ArrayList<E> le classi generiche che definiscono i vettori quando il tipo base non è specificato. Si noti che <E> può essere considerata una variabile di tipo, che può essere istanziata con qualunque classe Java. Le classi generiche Vector<E> e ArrayList<E> sono sostanzialmente equivalenti, ma: I metodi di Vector<E> sono sincronizzati, mentre quelli di ArrayList<E> non lo sono. Quindi se il programma èconcorrente (cioè usa il multi-threading di Java) è opportuno usare Vector<E>, altrimenti conviene sempre ArrayList<E> perchè più efficiente. Vector<E> fornisce, con opportuni metodi e costruttori, un controllo maggiore sulla capacità, cioè la dimensione dell'array soggiacente. Per motivi storici, Vector<E> fornisce più metodi con nomi diversi per manipolare gli elementi di un vettore. In genere conviene abituarsi ad usare sempre la classe ArrayList

Classi Vector<E> e ArrayList<E>: costruttori I costruttori di Vector<E> permettono di specificare la capacità iniziale del vettore (initialcapacity) e il valore da usare per aumentarela capacità (capacityincrement) quando necessario. Se (capacityincrement == 0), il nuovo array avrà capacità doppia rispetto all'attuale. /* crea un vettore vuoto, con i parametri specificati */ Vector (int initialcapacity, int capacityincrement) /* per default, capacityincrement=0 */ Vector (int initialcapacity) /* per default, initialcapacity = 10 e capacityincrement = 0 */ Vector () I costruttori di ArrayList<E> permettono di specificare solo la capacità iniziale del vettore. /* crea un vettore con la capacita' iniziale indicata */ ArrayList (int initialcapacity) /* crea un vettore vuoto; la capacita' iniziale non e' specificata */ ArrayList ()

Come usare i Vettori Si usa preferibilmente quando un array I dati sono tipi elementari; La lunghezza dell'array è nota al momento della creazione; La lunghezza dell'array non varia dinamicamente. ArrayList I dati non sono tipi elementari o si usa un tipo involucro; La lunghezza non è nota al momento della creazione; La lunghezza varia dinamicamente; Vector Solo per compatibilità con programmi vecchi.

Principali metodi di ArrayList boolean add(object element) Aggiunge l elemento alla fine della lista. void add(int index, Object element) Inserisce l elememnto nella posizione specificata dall indice. Object get(int index) Ritorna l elemento della lista dell indice specificato. Object set(int index, Object element) Sostituisce l elemento dell indice specificato con l elemento specificato. void clear() Rimuove tutti gli elementi dalla lista. Iterator iterator() Ritorna un Iteratore per scorrere gli elementi in sequenza. int size() Ritorna il numero degli elementi della lista.

Iterator Modo universale per scorrere collezioni di elementi, indipendentemente dalla particolare disposizione degli elementi Il metodo Iterator iterator() è disponibile in tutte le classi che estendono la Collection Iterator boolean hasnext() Ritorna true se l iterazione contiene ulteriori elementi. Object next() Ritorna il prossimo elemento dell iterazione. void remove() Rimuove dalla collezione l ultimo elemento iterato (optional operation).

Come funziona un Iteratore

Esercizio Scrivere un metodo java int somma(arraylist a) che somma gli elementi del vettore di interi utilizzando gli iteratori. 5 3 4 8 2 Somma: 22 Ciclo di scorrimento: Si ricava l iteratore dall ArrayList Si utilizza un ciclo while che utilizza come condizione Il metodo hasnext() dell iteratore per continuare a ciclare, Si usa next() per avere l elemento corrente

Esempio public static int somma(arraylist a){ } int somma=0; Iterator i=a.iterator(); while (i.hasnext()){ Integer val=(integer)i.next(); somma=somma+val.intvalue(); } return somma;

Il costrutto foreach in java Il foreach è un particolare costrutto (disponibile a partire da Java 5) che ci permette di iterare velocemente una struttura dati. In java possiamo usarlo sia su un array oppure su oggetti di tipo Iterable, cioè che dispongono di un iteratore (java.util.iterator). Le Collections di java (Linkedlist, ArrayList, etc.) sono tutti oggetti di tipo Iterable. il costrutto generico è il seguente : for(type var : array) { //ciclo }

Esempio somma elementi ciclo for e forech Ciclo For public static int somma(int [] array) { int somma = 0; for(int i = 0; i < array.length; i++) { somma += array[i]; } return somma; } Ciclo Forech public static int somma(int [] array) { int somma = 0; for(int element:array) somma+=element; return somma; }

Iterazione di un ArrayList Iterator ArrayList <String> lista = new ArrayList<String>(); lista.add("a"); lista.add("b");... Iterator <String> it = lista.iterator(); while(it.hasnext()) { String str = it.next();... } Ciclo Forech for(string str:lista) {... }

LinkedList Rappresenta una lista di oggetti doppiamente concatenata in cui ogni nodo punta sia al suo predecessore che al suo successore

Principali metodi di LinkedList

Creare una pila con LinkedList public class Pila { private LinkedList list; public Pila() { list=new LinkedList(); } public void push(object o) { list.addfirst(o); } public Object pop() { return list.removefirst(); } public int size() { return list.size();} }

Creare una coda con LinkedList public class Coda { private LinkedList list; public Coda() { list=new LinkedList(); } public void push(object o) { list.addlast(o); } public Object pop() { return list.removefirst(); } public int size() { return list.size();} }

la classe Stack<E> In Java la classe Stack estende Vector, implementando direttamente i metodi: empty() Controllo se la pila è vuota oppure no peek() Lettura dell'elemento in cima alla pila, senza eliminarlo pop() Estrazione dell'elemento in cima alla pila push(e item) Inserimento di un elemento in cima alla pila ed eredita da Vector (tra gli altri) il metodo clear(). Il fatto di estendere Vector permette di usare anche tutti i suoi metodi, in particolare l'accesso diretto agli elementi, (possibilità poco elegante ma spesso comoda).

la classe ArrayDeque<E> In informatica, una deque (solitamente pronunciato come deck, è l'abbreviazione di double-ended queue, cioè coda doppia) è una struttura dati astratta simile a una lista, anche chiamata lista concatenata testa-coda in quanto gli elementi possono essere aggiunti o rimossi solamente dalla testa o dalla coda. La classe ArrayDeque implementa una coda a doppia entrata I principali metodi sono addfirst(e) Inserisce e all inizio del deque addlast(e) Inserisce e alla fine del deque removefirst() Restituisce e rimuove il primo elemento del deque removelast() Restituisce e rimuove l ultimo elemento del deque getfirst() Restituisce il primo elemento del deque getlast() Restituisce l ultimo elemento del deque size() Restituisce il numero di elementi del deque isempty() Restituisce true se il deque è vuoto e false altrimenti