Collection & Generics in Java

Slides:



Advertisements
Presentazioni simili
Interfacce Java.
Advertisements

Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
prompt> java SumAverage
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Ultima Lezione del Corso di Fondamenti di Informatica 1 a.a – 06 Ma 29-Nov-2005.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Algoritmi e Strutture Dati
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Java Collections.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
© M. Badella, G. Malnati, L. Tessitore Programmazione ad Oggetti A.A Collezioni di dati in Java.
Collection & Generics in Java
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
Specifiche. Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
Esercitazione sull’ ordinamento 20 maggio 2003
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (I parte)
Collezioni in Java. Collection Framework JFC Java Collection Framework (JCF) fornisce il supporto a qualunque tipo di struttura dati, nel quadro di un'architettura.
Programmazione: Iterazione Esistono tre tipi di iterazione fondamentali e vedremo la corrispondenza dei relativi diagrammi a blocchi e la loro traduzione.
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
© 2007 SEI-Società Editrice Internazionale, Apogeo
ODMG.
Java: concetti e costrutti base
Commenti Ogni riga che comincia con il simbolo # non viene letta dall’interprete per cui rappresenta un modo per commentare il listato # Questo è un esempio.
Dati MIDI in Java Lezione 19
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Bubble Sort.
Tecniche di Problem-Solving
Esercizi.
Vettori dinamici Definiremo la classe vector.
Programmazione Parametrica ( a.k.a. Generics )
ABAP Objects ALV Grid Mantova, 30 dicembre 2018.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
comprensione e modifica di codice
concetti ed applicazioni
Usando strutture dati nella piattaforma Java Collections Framework
Scandire …...
Ricerca 01/08/2019 package.
Ese 1 (del 31 Marzo 2004).
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Collection & Generics in Java

Parte I JCF: Collections in Java

Collezionare oggetti Problema: raggruppare un insieme di oggetti insieme e accedere ad essi secondo regole particolari (per esempio una Coda). Spessi l’utilizzo degli array non è sufficiente Soluzione 1: Realizzare una propria classe che, utilizzando internamente gli array, fornisce i metodi di accesso opportuni Soluzione 2: Utilizzare classi già pronte fornite da Java, scegliendo quella più opportuna ai propri bisogni Java fornisce un insieme molto ampio di classi (concrete) in grado di collezionare oggetti fornendo un interfacce (estese dalle proprie classi) relative a Pile, Code, Insiemi, Liste, Mappe, Insiemi ordinati ecc … (JCF) Java Collections Framework

(JCF) Java Collections Framework/1 List ArrayList LinkedList Vector Set SortedSet TreeSet HashSet LinkedHashSet Altre interfacce disponibili Queue,Dequeue,Stack, Map, SortedMap …

(JCF) Java Collections Framework/2 Group of objects, known as its elements. Some collections allow duplicate elements and others do not. Some are ordered and others unordered. boolean add(Object e) void clear()   boolean contains(Object o)   Iterator iterator()   boolean remove(Object o)  int size() List An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted E get(int index) E set(int index, E element) Set A collection that contains no duplicate elements SortedSet A collection that contains sorted elements

Tipi degli oggetti nelle collezioni Tutti gli oggetti in java estendono da Object E’ corretto scrivere: Object o=new Integer(10); Le collection di java gestiscono elementi di tipo Object Esse possono contenere elementi di tipo object quindi un qualunque oggetto java può essere aggiunto in una collezione NB: Gli oggetti vengono ritornati come Object e non del loro tipo specifico ArrayList a=new ArrayList(); a.add(new Integer(10));//aggiungo un intero Object elem=a.get(0); //oggetto di tipo Object Per ottenere il tipo originario è necessario il cast esplicito Integer i=(Integer) a.get(0);//cast esplicito

ArrayList public class ArrayList extends … boolean add(Object e) Appends the specified element to the end of this list. void add(int index, Object element) Inserts the specified element at the specified position in this list. Object get(int index) Returns the element at the specified position in this list. Object set(int index, Object element) Replaces the element at the specified position in this list with the specified element. void clear() Removes all of the elements from this list. Iterator iterator() Returns an iterator over the elements in this list in proper sequence. int size() Returns the number of elements in this list.

Esercizio 1 Scrivere un metodo java int somma(ArrayList a) che somma gli elementi del vettore di interi. Somma: 22 Suggerimenti: utilizzare i metodi get per ottenere gli elementi del vettore e size per conoscere il numero di elementi totali. Usando il cast si possono ottenere gli oggetti del tipo opportuno Il metodo intValue() della classe Integer permette di ricavare il tipo int 5 3 4 8 2

Esercizio 1 - Soluzione public static int somma(ArrayList a){ for (int i=0;i<a.size();i++){ Integer elem=(Integer)a.get(i) somma=somma+elem.intValue(); //tipo primitivo } return somma;

Iterator Modo “universale” per scorrere collezioni di elementi, indipendentemente dalla particolare disposizione degli elementi Il metodo Iterator iterator() è disponibile in tutte classi che estendono da Collection Iterator boolean hasNext() Returns true if the iteration has more elements. Object next() Returns the next element in the iteration. void remove() Removes from the underlying collection the last element returned by the iterator (optional operation).

Esercizio 2 Scrivere un metodo java int somma(ArrayList a) che somma gli elementi del vettore di interi utilizzando gli iteratori. Tempo 5 minuti … Suggerimenti: ricavare l’iteratore dall’ArrayList e scorrere l’iteratore mediante un while; per la condizione utilizzare il metodo hasNext() dell’iteratore, next() per avere l’elemento corrente 5 3 4 8 2

Esercizio 2 - Soluzione public static int somma(ArrayList a){ Iterator i=a.iterator(); while (i.hasNext()){ Integer val=(Integer)i.next(); somma=somma+val.intValue(); } return somma;

Collection public interface Collection boolean add(Object e) Appends the specified element to the end of this list. void add(int index, Object element) Inserts the specified element at the specified position in this list. void clear() Removes all of the elements from this list. Iterator iterator() Returns an iterator over the elements in this list in proper sequence. int size() Returns the number of elements in this list. boolean isEmpty() Returns true if this collection contains no elements. … altri metodi

List public interface List extends Collection Ereditate da Collection boolean add(Object e) void add(int index, Object element) void clear() Iterator iterator() int size() boolean isEmpty() E get(int index) Returns the element at the specified position in this list. E remove(int index) Removes the element at the specified position in this list (optional operation). E set(int index, E element) Replaces the element at the specified position in this list with the specified element (optional operation). … altri metodi

ArrayList public class ArrayList …implements List Ereditate da List boolean add(Object e) void add(int index, Object element) void clear() Iterator iterator() int size() boolean isEmpty() E get(int index) E remove(int index) E set(int index, E element) … altri metodi

Vector public class Vector …implements List Ereditate da List boolean add(Object e) void add(int index, Object element) void clear() Iterator iterator() int size() boolean isEmpty() E get(int index) E remove(int index) E set(int index, E element) … altri metodi Analogo ad ArrayList ma l’implementazione è thread-safe ed è in genere più lenta

LinkedList public class LinkedList …implements List Ereditate da List boolean add(Object e) void add(int index, Object element) void clear() Iterator iterator() int size() boolean isEmpty() E get(int index) E remove(int index) E set(int index, E element)  E getFirst() Returns the first element in this list.  E getLast() Returns the last element in this list. … altri metodi NB: L’implementazione di get e set hanno costo O(n)

Possibili problemi con le collection La mancanza di un controllo sui tipi porta ad alcuni problemi: Necessità di ricorrere al cast degli elementi anche quando il tipo di elementi è noto ArrayList a=new ArrayList(); a.add(new Integer(10)); ... Integer i=(Integer)a.get(0); Possibili cast degli elementi a tipi non corretti String i=(String)a.get(0);//eccezione!!!

Possibili problemi con le collection/2 Nessun controllo sui tipi di dati inseriti all’interno di un vettore ArrayList a=new ArrayList(); a.add(new Integer(10)); ... a.add(new String(“paperino”));//? Integer i=(Integer)a.get(0);//OK Integer j=(Integer)a.get(1);//cast exception Poca chiarezza sul tipo di dati trattati public static ArrayList calcolaQualcosa() //che tipi contiene? NB: In tutti i casi, il codice risulta sintatticamente corretto e non viene segnalato alcun errore dal compilatore. L’errore viene scoperto solo a Runtime!

Parte II I Generics

Generics /1 Programmazione generica: creazione di costrutti di programmazione che possano essere utilizzati con tipi di dati diversi. In Java si può raggiungere l’obiettivo della programmazione generica usando l’ereditarietà oppure le variabili di tipo. Esempio: ArrayList di Java  ArrayList<String> Classe generica: è stata dichiarata usando una variabile di tipo E. La variabile di tipo rappresenta il tipo degli elementi: public class ArrayList<E> // si può usare "ElementType" invece di E { public ArrayList() { . . . } public void add(E element) { . . . } . . . }

Generics /2 Le variabili di tipo possono essere sostituite, all’atto della creazione di esemplari, con nomi di classe o di interfacce ArrayList<String> ArrayList<MyClass> Non si può usare come sostituto uno degli otto tipi di dati primitivi ArrayList<double> // Sbagliato! Usate un esemplare di ArrayList<Double>

Generics /3 Il tipo di dato che indicate va a sostituire la variabile di tipo utilizzata nella definizione dell’interfaccia o della classe generica Esempio: nel metodo add di un oggetto di tipo ArrayList<String> la variabile di tipo E viene sostituita dal tipo String public void add(String element)

Generics /4 Le variabili di tipo rendono più sicuro e di più facile comprensione il codice generico. E’ impossibile aggiungere un oggetto di tipo Integer ad un esemplare di ArrayList<String> È invece possibile aggiungere un oggetto di tipo Integer ad un esemplare di ArrayList (senza generics) che sia stato creato con l’intenzione di usarlo per contenere stringhe

Generics /5 ArrayList<String> a1 = new ArrayList<String>(); Integer numero=new Integer(30); // Dovrebbe contenere oggetti di tipo String ArrayList a2 = new LinkedList(); // errore di compilazione a1.add(numero); // errore non individuato dal compilatore a2.add(numero); //errore di esecuzione String account = (String) a2.get(0);

ArrayList<E> e Iterator<E> boolean add(E e) void add(int index, E element) E get(int index) E set(int index, E element) void clear() Iterator<E> iterator() int size() Iterator<E> boolean hasNext() E next() void remove()

Esercizio 3 Scrivere un metodo java int somma(ArrayList<Integer> a) che somma gli elementi del vettore di interi. Somma: 22 5 3 4 8 2

Esercizio 3 - Soluzione int somma=0; for (int i=0;i<a.size();i++){ public static int somma(ArrayList<Integer> a){ int somma=0; for (int i=0;i<a.size();i++){ Integer elem=a.get(i) somma=somma+elem.intValue(); } return somma;

Esercizio Data la porzione di codice: ArrayList<String> s=new ArrayList<String>(); a.add(new Integer(10)); ArrayList p=new ArrayList (); p.add(new Integer(10)); Indicare quali, tra le istruzioni seguenti, genera un errore in compilazione o in esecuzione (eccezione): s.add(“paperino”); s.add(new Integer(10)); String q=s.get(0); Object o=s.get(0); Integer i=s.get(0); s.add(s.get(0)); p.add(“paperino”); String q=p.get(0); Object o=p.get(0); Integer i=p.get(0); p.add(p.get(0));

Esercizi iteratori

Matrice

import java.util.Iterator; public class MatrixIterator implements Iterator<Float> { private Matrix matrix; private int currentRow = 1, currentColumn = 1; public MatrixIterator(Matrix matrix) { this.matrix = matrix; } public boolean hasNext() { return currentRow <= matrix.rows(); public Float next() { float element = matrix.element(currentRow, currentColumn); currentColumn++; if (currentColumn > matrix.columns()) { currentColumn = 1; currentRow++; return element; public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException();

Variante L’iteratore può essere definito assieme alla classe Utile quando si ha una classe iterabile La soluzione precedente è però più generale Sono definite all’interno di un’altra classe Una sola compilation unit contiene sia l’astrazione sui dati sia quella sul controllo Possono accedere ai campi e metodi della classe che li ospita Non è necessario passare all’iteratore un riferimento all’oggetto su cui sta iterando

Rendiamo la matrice iterabile

Usiamo l’iteratore

Commento sugli iteratori Modificando l’oggetto dopo aver creato l’iteratore potremmo avere comportamenti inattesi Esempio: insieme di interi e iteratore che li restituisce in modo ordinato. Cosa potrebbe succedere modificando l’insieme?

Iteratore di Zenone Come l’iteratore di Fibonacci, non itera su una collezione di oggetti ma genera una sequenza di elementi. http://it.wikipedia.org/wiki/Paradossi_di_Zenone

Polinomi Scrivere un iteratore che restituisca i coefficienti del polinomio, ordinati per grado Esempio: per 3 + 2x deve restituire la sequenza 3 2 NoSuchElementException