Collezioni in Java. Collection Framework JFC Java Collection Framework (JCF) fornisce il supporto a qualunque tipo di struttura dati, nel quadro di un'architettura.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
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.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
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.
Struct, enum, Puntatori e Array dinamici
Java Collections.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
© M. Badella, G. Malnati, L. Tessitore Programmazione ad Oggetti A.A Collezioni di dati in Java.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 non vogliamo definire versioni differenti dell’astrazione corrispondente ad una collezione di elementi.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
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.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.
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.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (I parte)
Corso di Algoritmi e Strutture Dati con Laboratorio Tipi di dato pila e coda.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Input in Java. Uso Scanner Un oggetto per la lettura dalla tastiera Piuttosto, per rappresentare la tastiera del nostro calcolatore useremo un oggetto.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Collezioni in Java

Collection Framework

JFC Java Collection Framework (JCF) fornisce il supporto a qualunque tipo di struttura dati, nel quadro di un'architettura logica globale e uniforme – interfacce che definiscono TIPI DI STRUTTURE DATI e i necessari concetti di supporto (es.: iteratori) – una classe Collections che definisce algoritmi polimorfi sotto forma di funzioni statiche, nonché servizi e costanti di uso generale; – classi che forniscono implementazioni dei vari tipi di strutture dati specificati dalle interfacce. Obiettivo: strutture dati per "elementi generici"

TRATTAMENTO DEI TIPI PRIMITIVI

Interfacce fondamentali : Collection: nessuna ipotesi sul tipo di collezione Set: introduce l’idea di insieme di elementi (quindi, senza duplicati) List: introduce l’idea di sequenza SortedSet: l'insieme ordinato Map: introduce l’idea di mappa, ossia tabella che associa chiavi a valori SortedMap: una mappa (tabella) ordinata

L'INTERFACCIA Collection Collection introduce l'idea di collezione di elementi non si fanno ipotesi sulla natura di tale collezione – in particolare, non si dice che sia un insieme o una sequenza, né che ci sia o meno un ordinamento,.. etc perciò, l'interfaccia di accesso è volutamente generale e prevede metodi per :

Implementazioni delle interfacce

Collection

ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione e rimane immutato. ! Per superare questa limitazione Java mette a disposizione la classe ArrayList, contenuta nel package java.util che permette di rappresentare sequenze di oggetti di lunghezza variabile. ! Ciascun oggetto in un’istanza di ArrayList viene identificato da un numero intero, detto indice, che ne indica la posizione. ! L'accesso ad una posizione inesistente provoca un errore (viene lanciata un'eccezione).

Dichiarazione Es: ArrayList nomi= new ArrayList(); Il tipo ArrayList specifica un vettore di stringhe

Alcuni metodi dell'ArrayList Bisogna usare il metodo add per aggiungere elementi nel vettore Es: nomi.add(“Marco”); aggiunge Marco al vettore nomi che ora ha dimensione 1 Per ispezionare il valore di un elemento si usa il metodo get Es: nomi.get(0); restituisce l’elemento avente indice 0 Per assegnare un nuovo valore a un elemento di un vettore si usa il metodo set Es: nomi.set(0,”Giovanni”); sostituisce l’elemento avente indice 0 con la stringa “Giovanni”

Si può anche inserire un elemento in una data posizione intermedia al’interno di un vettore: Es: nomi.add(0,”Laura”) sposta il primo elemeto al secondo elemento e mette a primo elemento la stringa “Laura” Al contrario il metodo remove elimina l’elemento che si trova in una determinata posizione, sposta di una posizione all’indietro tutti gli elementi che si trovano dopo l’elemento rimosso Es: nomi.remove(0) Il metodo size restituisce la dimensione del vettore Es: nomi.size()

Tipiche operazioni su di una collezione richiedono di esaminare tutti gli elementi, uno alla volta. Esempi: stampa, somma, ricerca di un elemento, minimo … Per un array o una lista si può usare un for for (int i = 0; i < arr.length; i++) System.out.println(arr[i]); for (int i = 0; i < list.size( ); i++) System.out.println(list.get(i));

Iterator Iterator astrae il processo di scandire gli elementi di un contenitore uno alla volta Permette di scandire gli elementi della struttura dati a prescindere dall’implementazione della struttura dati

Metodi di Iterator Iterator supporta i seguenti metodi: next() : restituisce il prossimo elemento nell’iteratore hasNext() : testa se ci sono altri elementi nell’iterato

L'interfaccia Java java.util.Iterator supporta anche il metodo remove che cancella l’elemento precedentemente restituito. Le classi che implementano Iterator possono non implementare remove public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException("remove"); }

Interfaccia Iterable „ Le strutture dati che supportano il metodo iterator() estendono la seguente interfaccia public interface Iterable { public Iterator iterator(); } Java fornisce l’interfaccia java.lang.Iterable

Un iteratore è tipicamente associato ad una struttura dati che rappresenta una collezione Un iteratore di una sequenza deve restituire gli elementi nell’ordine lineare che hanno nella sequenza

Esempio di Scansione con l'iterator import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArralistIteratorExample { public static void main(String[] args) { //Create a list of names List names = new ArrayList(); //Add some names in list names.add("Eve"); names.add("Anna"); names.add("Tonny"); names.add("Steve"); System.out.println("Using Iterator"); Iterator iterator = names.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }

For each System.out.println("Using Advanced for loop"); for (String name : names) { System.out.println(name); }

Mappe

Map Per chi non le avesse mai usate le HashMap sono una implementazione contenuta nelle API Java dell’interfaccia java.util.Map. La mappa (chiamata Dictionary nel mondo.Net) non è altro che una collezione di oggetti il cui scopo principale è quello di rendere veloci ed efficienti operazioni quali inserimento e ricerca di elementi. Per fare questo una mappa memorizza coppie (chiave, valore) e ha due implementazioni, del tutto generali: HashMap e TreeMap. Per approfondimenti potete consultare il nostro post sulle Java Collection.Java Collection

Tabelle

L'interfaccia java.util.Map specifica il tipo Map con chiavi di tipo K e valori associati di tipo VPer una descrizione esauriente si rimanda alla documentazione ufficiale, qui ci limitiamo a segnalare i metodi principali. Il metodo V put(K key, V value) associa il valore value alla chiave key, sostituendo il valore precedente se già presente, viene reso il valore precedente se già presente, nullaltrimenti. Il metodo V get(Object key) restituisce il valore associato alla chiave key, oppure null se la chiave non è presente. Può essere lanciata l'eccezione ClassCastException sekey non è di un tipo compatibile. Il metodo V remove(Object key) rimuove la chiave key, e il valore associato se già presenti, viene reso il valore precedente se già presente, null altrimenti. Può essere lanciata l'eccezione ClassCastException se key non è di un tipo compatibile. Il metodo boolean containsKey(Object key) restituisce true se la map contiene un'associazione per la chiave data.

Il metodo boolean containsValue(Object value) restituisce true se la map contiene una o più chiavi associate al valore dato. Il metodo Set keySet() Restituisce un insieme (ovvero una Collection senza ripetizioni) che rappresenta le chiavi presenti nella tabella (ovviamente, senza ripetizioni). Il metodo Collection values() Restituisce una Collection che rappresenta i valori presenti nella tabella (ovviamente, ogni valore compare tante volte quante è presente in tabella). Il metodo Set > entrySet() Restituisce una insieme di Map.Entry che rappresenta le coppie chiave - valore presenti nella tabella.Map.Entry è un "contenitore" che permette di stampare la coppia (attraverso il metodo toString implicito, o di accedere alla chiave o al valore con i metodi getKey() e getValue(). Inoltre, tra gli altri, vi sono i metodi: clear(), isEmpty(), size(), equals(), dall'ovvio significato.

Map h = new HashMap ();

Esempio Hash Map map.put(21, "Twenty One"); map.put(31, "Thirty One"); Iterator keySetIterator = map.keySet().iterator(); while(keySetIterator.hasNext()){ Integer key = keySetIterator.next(); System.out.println("key: " + key + " value: " + map.get(key)); } Output: key: 21 value: Twenty One key: 31 value: Thirty One

Enumerativi

public enum Giorno { LUNEDI, MARTEDI, MERCOLEDI, GIOVEDI, VENERDI, SABATO, DOMENICA // opzionalmente può terminare con ";" } FATE MOLTA ATTENZIONE ALLE MAIUSCOLE E ALLE MINUSCOLE

Uso

Carratteristiche degli enum for( Giorno d : Giorno.values() ) { System.err.println(d); } Le caratteristiche della classe enum Tecnicamente parlando in Java una enum è una classe come le altre ma che “implicitamente” (cioè senza che lo scriviamo noi) estende sempre la classe java.lang.Enum, cosa che ha l’unico inconveniente di rendere impossibile di scrivere enum che derivino da altri tipi. Il trattamento speciale che Java riserva agli enum riserva anche qualche interessante sorpresa: il compilatore per ogni classe enum sintetizza per noi un metodo statico (values) che ritorna un array di tutti i possibili valori che potranno assumere le variabili cha varanno come tipo l’enum, quindi nel nostro esempio il frammento di codice:

Riassumiamo Enum risolve quindi un’esigenza reale, quella di definire un insieme di valori predefiniti, senza ricorrere alla mediazione di costanti intere, con la possibilità di avere una classe. Come abbiamo visto anche le enumerazioni possono essere utilizzate nei cicli for-each (for-in) e nei costrutti switch. Il metodo toString(), di default, è uguale al nome assegnato alla variabile, ma vedremo come poterlo modificare.

Ecco una breve lista delle caratteristiche delle enumerazioni che ci aiuta a comprenderne la logica per utilizzarle al meglio: Una enumerazione è una classe, in particolare l’estensione della classe java.lang.Enum, quindi come tale ha tutte le attenzioni sul controllo dei tipi in fase di compilazione. I tipi definiti in una enumerazione sono istanze di classe, non tipi interi. I valori di una enumerazione sono public final static, quindi immutabili. Il metodo == è sovrascritto, quindi può essere usato in maniera intercambiabile al metodo equals. Esiste la coppia di metodi valueOf()/toString() che possono essere sovrascritti.

Oridamento

Intefaccia comparable per ordinare Per ordinare liste di oggetti in Java sono a disposizione due interfacce: java.lang.Comparable java.util.Comparator L’interfaccia java.lang.comparable di solito si utilizza per definire l’ordinamento “naturale” di un oggetto e consta di un metodo con firma int compareTo(T o) che paragona l’oggetto corrente (this) con l’oggetto fornito in input al metodo (o). Il risultato sarà: un intero positivo se this>o 0 se sono uguali un intero negativo se this<0

Esempio implementando compareTo L’ordinamento definito è sul cognome; si noti che utilizziamo il metodo compareTo dell’oggetto String che di default ordina in modo alfabetico crescente (A-Z). Sfrutto l’ordinamento basato sul cognome e che sfrutta il compareTo di String public class Persona implements Comparable { public Persona(){ } public Persona(String nome,String cognome,int eta){ this.nome=nome; this.cognome=cognome; this.eta=eta; } private String nome; private String cognome; private int eta; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } public int getEta() { return eta; } public void setEta(int eta) { this.eta = eta; public int compareTo(Persona o) { return this.cognome.compareTo(o.cognome); } }

Comparator L’interfaccia java.util.Comparator si utilizza invece quando si vogliono definire ordinamenti alternativi dell’oggetto. Si crea dunque una classe a parte che implementa l’interfaccia con il seguente metodo: public int compare(T a,T b); Il risultato sarà: un intero positivo se a>b 0 se sono uguali un intero negativo se a<b

Implementazione import java.util.Comparator; public class PersonaEtaComparator implements Comparator public int compare(Persona p1, Persona p2) { int retVal=0; if(p1.getEta()>p2.getEta()) { retVal=1; } else if(p1.getEta()<p2.getEta()) { retVal=-1; } return retVal; }

Testiamone il Funzionamento public class TestOrdinamento { public static void main(String[] args) { LinkedList lista=new LinkedList (); lista.add(new Persona("mario","rossi",25)); lista.add(new Persona("luigi", "bianchi", 55)); lista.add(new Persona("mario","verdi",14)); lista.add(new Persona("luigi", "gialli", 45)); lista.add(new Persona("mario","maffei",32)); lista.add(new Persona("luigi", "servillo", 56)); System.out.println("Non ordinata>>"+lista); Collections.sort(lista); System.out.println("Ordinamento Naturale>>"+lista); Collections.sort(lista,new PersonaEtaComparator()); System.out.println("Ordinamento per età>>"+lista); }