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