Introduzione Generics Iteratori Collezioni in Java Dr. Giulio Pellitta 13 aprile 2011 Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map Cos’è una collezione? Gerarchia delle collezioni Una collezione è semplicemente un oggetto che raggruppa più oggetti (detti elementi della collezione) in una singola unità. Map Collection Set List Queue SortedMap Sorted Set Figura: Interfacce fondamentali di collezioni. Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map Outline 1 Introduzione Collection Map 2 Generics Collezioni Collezioni ordinate Comparatori 3 Iteratori Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map Una collezione può essere ordinata o no e ammettere o meno elementi duplicati. L’interfaccia Collection, non specifica nessuno di questi aspetti e infatti non ci sono classi che la implementano direttamente. Le sue sottointerfacce sono: Set non ammette ripetizioni di elementi (la sottointerfaccia SortedSet fornisce in aggiunta un ordine totale sui suoi elementi); List l’utente può decidere l’ordine in cui inserire gli elementi, a cui può accedere usando l’indice della loro posizione; Queue prevede operazioni di inserimento, rimozione e ispezione degli elementi (due metodi per ciascuna, uno dei quali lancia un’eccezione se fallisce l’operazione), l’ordinamento è tipicamente FIFO . Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map Alcune classi che implementano le sottointerfacce di Collection Set HashSet: insieme di elementi il cui accesso è regolato da una hash table (add, remove, contains e size eseguono in tempo costante se hash degli elementi abbastanza random); SortedSet TreeSet: un insieme ordinato di elementi (metodi per sottoinsieme elementi maggiori/minori di); List Vector/ArrayList: array (ovvero collezione ai cui elementi si accede tramite l’indice della posizione) la cui dimensione può essere aumentata o diminuita; Queue LinkedList: rappresenta uno stack, una coda o una doppia coda (ha metodi per esaminare, rimuovere e inserire elementi a inizio e fine lista). Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map Outline 1 Introduzione Collection Map 2 Generics Collezioni Collezioni ordinate Comparatori 3 Iteratori Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collection Map L’interfaccia Map definisce una funzione da chiavi a valori. Ad una chiave è associato (al più) un valore. Non è una collezione in senso stretto. Si può vedere il contenuto della mappa come un insieme (Set) di chiavi, una collezione (Collection) di valori, o un insieme (Set) di corrispondenze tra chiavi e valori. La sottointerfaccia SortedMap fornisce inoltre un ordine totale sulle chiavi. Esempi di classi che implementano Map e SortedMap Map HashMap (implementazione di Map basata su hash table), HashTable (hash table basata sui metodi hashCode e equals delle chiavi); SortedMap TreeMap (Map ordinata rispetto alle sue chiavi). Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Errori che sfuggono a tempo di compilazione public class Box { //classe che contiene un oggetto private Object object; // di tipo non specificato (Object) public void add(Object object) { this.object = object; } public Object get() { return object; } } public class BoxDemo { public static void main(String[] args) { // Qui metti solo interi! Box integerBox = new Box(); //... molto codice ... integerBox.add("10"); // notare il tipo String Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger); } } Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Generics Uno strumento in più per la rilevazione d’errori Il codice precedente compila correttamente, ma a tempo d’esecuzione. . . Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at BoxDemo.main(BoxDemo.java:7) La riga segnalata può essere anche molto lontana da quella che realmente lo causa, quindi rintracciarla può essere difficile. Se invece la classe Box fosse stata definita con i generics allora ad ogni sua istanza sarebbe associato chiaramente il tipo di oggetto che contiene. E l’errore sarebbe stato rilevato già a tempo di compilazione (e sulla riga da cui ha effettivamente origine ). public class Box<T> { private T t; // T sta per "Tipo" public void add(T t) { this.t = t; } public T get() { return t; } } Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Outline 1 Introduzione Collection Map 2 Generics Collezioni Collezioni ordinate Comparatori 3 Iteratori Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Collezioni con i generics Le collezioni definite sopra sono generiche, quindi si può (e sarebbe meglio) specificare il tipo di oggetti che contengono. public interface Collection<E>... Il codice risulta anche più leggibile perché non è necessario fare un cast ogni volta che si estrae un oggetto dalla collezione. Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Outline 1 Introduzione Collection Map 2 Generics Collezioni Collezioni ordinate Comparatori 3 Iteratori Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Se poi le collezioni con cui abbiamo a che fare sono ordinate, allora usando i generics possiamo ordinare automaticamente gli elementi che contengono purché la classe a cui appartengono implementi l’interfaccia Comparable public interface Comparable<T>{ public int compareTo(T o); } L’espressione x.compareTo(y) restitutisce un valore negativo o positivo a seconda che x sia minore o maggiore di y ((x.compareTo(y)==0) == (x.equals(y)) è fortemente raccomandato ma non strettamente necessario). Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Ordinare tipi di dati definiti dall’utente Oltre ai tipi già forniti da Java (String, Integer, Float, ...) si possono avere collezioni anche di oggetti di classi definite dal programmatore, purché implementino l’interfaccia Comparable. Ordinare dei nomi di persona (per cognome e poi per nome) public class Name implements Comparable<Name> { private final String firstName, lastName; //... public boolean equals(Object o) { if (!(o instanceof Name)) return false; Name n = (Name)o; return n.firstName.equals(firstName) && n.lastName.equals(lastName); } //... public int compareTo(Name n) { int lastCmp = lastName.compareTo(n.lastName); return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); } } Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Outline 1 Introduzione Collection Map 2 Generics Collezioni Collezioni ordinate Comparatori 3 Iteratori Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Collezioni Collezioni ordinate Comparatori Se si ha l’esigenza di ordinare una collezione in maniera diversa dal suo ordine naturale (quello definito dal metodo compareTo dell’interfaccia Comparable) allora si usano oggetti detti comparatori, definiti dalla seguente interfaccia. public interface Comparator<T> { int compare(T o1, T o2); } Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Per scorrere gli elementi di una collezione ci sono due modi. enhanced for Questo costrutto permette di scorrere gli elementi di un array o una collezione. Come stampare gli elementi di una collezione for (Object o : collection) System.out.println(o); Iterator<E> Un oggetto che permette di scorrere una collezione, ottenuto chiamando il metodo iterator della collezione stessa; approccio più potente, un iteratore permette anche di rimuovere l’elemento corrente; mette a disposizione i metodi boolean hasNext(), E next() e void remove(). Dr. Giulio Pellitta Collezioni in Java Introduzione Generics Iteratori Lesson: Generics (The JavaTM Tutorials > Learning the Java Language). http://download.oracle.com/javase/tutorial/ java/generics/index.html. Lesson: Introduction to Collections (The JavaTM Tutorials > Collections). http://download.oracle.com/javase/tutorial/ collections/intro/index.html. Overview (Java Platform SE 6). http: //download.oracle.com/javase/6/docs/api/. Bruce Eckel. Thinking in Java, chapter Holding your Objects, pages 275–311. 4th edition. Dr. Giulio Pellitta Collezioni in Java