le collezioni (java collections) - intranet...
TRANSCRIPT
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Liste e insiemi
Insieme
Lista (sequenza)
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Il framework Collection
Le collection di Java rappresentano�mn’architettura�mnificatapreposta all’uso e al trattamento di gruppi di oggetti.Consistono di:
Interfacce: tipi di dati astratti che rappresentano collezioni,come List, Queue, Set e MapImplementazioni astratte: parziali implemetazioni diinterfacce facilmente riadattabiliImplementazioni concrete: classi basilari cheimplementano le interfacce fondamentaliAlgoritmi: implementazioni di funzioni basilari comeordinamento e ricerca, applicabili a tutte le collezioniUtilita: funzioni basilari applicate ad array di primitivi eriferimento
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
La gerarchia delle interfacce
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
L’interfaccia Collection
public interface Collection<E> extends Iterable<E> {// Op e r a r igfa�ZYk]
int size();boolean isEmpty();boolean contains(Object element);boolean add(E element); // Optional
boolean remove(Object element); // Optional
Iterator iterator();// Op e r aragfa�kmdd±afka]e]
boolean containsAll(Collection<?> c);boolean addAll(Collection<? extends E> c); // Optional
boolean removeAll(Collection<?> c); // Optional
boolean retainAll(Collection<?> c); // Optional
void clear(); // Optional
// O p e r aragfa�km�YjjYq
Object[] toArray();<T> T[] toArray(T[] a);
}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Contratto del metodo add(E o) - opzionale
... Returns true if this collection changed as a result ofthe call. (Returns false if this collection does not permitduplicates and already contains the specified element.)... limitations on what elements may be added to thiscollection. In particular, some collections will refuse to addnull elements, and others will impose restrictions on thetype of elements that may be added. Collection classesshould clearly specify in their documentation anyrestrictions on what elements may be added.If a collection refuses to add a particular element for anyreason other than that it already contains the element, itmust throw an exception (rather than returning false)...
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Le interfacce di Collection
Collection e la radice della gerarchia delle collection.Rappresenta gruppi di oggetti (elementi) chepossono essere duplicati oppure no. Alcunepossono essere ordinate altre no. Esistonoimplementazioni concrete di sottointerfacce qualiList e Set
List cattura il concetto di lista ordinata (o sequenza):gruppo di elementi posti in un qualche ordine.Implementazioni: ArrayList, LinkedList eVector
Set cattura il concetto di insieme: gruppo di elementiche non contiene duplicati (non contiene e1 e e2se e1.equals(e2)©. Implementazioni: HashSet
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Gerarchia (parziale) di Collection (List e Set)
Collection
List Set
HashSetArrayList LinkedList
�@7IB=�A9HC8=�5;;=IBH=J=�89@@W=BH9F:577=5�List!!public void add(int index, E element)!Inserts!the!specified!element!at!the!specified!posi2on!in!this!list!(op2onal!opera2on).!!Shi7s!the!element!currently!at!that!posi2on!(if!any)!and!any!subsequent!elements!to!the!right!(adds!one!to!their!indices).!public E get(int index)!Returns!the!element!at!the!specified!posi2on!in!this!list.!public int indexOf(Object o) [lastIndexOf(Object o)]!Returns!the!index!of!the!first![last]!occurrence!of!the!specified!element!in!this!list,!or!C1!if!this!list!does!not!contain!the!element.!public E remove(int index)!Removes!the!element!at!the!specified!posi2on!in!this!list!(op2onal!opera2on).!!Shi7s!any!subsequent!elements!to!the!le7!(subtracts!one!from!their!indices).!!Returns!the!element!that!was!removed!from!the!list.!
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempio
class Gatto {// co s t r u t t o r e
public Gatto(int i)// re s t i t u i s c e l ’ i d e n t i f i c a t i v o unico
public int getID()}
public class Cane {// co s t r u t t o r e
public Cane(int i)// re s t i t u i s c e l ’ i d e n t i f i c a t i v o unico
public int getID()}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempio: uso di non-generici
import java.util.*;
public class CaniEGatti {public static void main(String[] args) {
/* de f i n i z i o n e tipica : uso del
r i f e r i m e n t o piu ’ astratto */
List gatti = new ArrayList();for(int i = 0; i < 7; i++)
gatti.add(new Gatto(i));
/* nessun problema ad a g g i u n g e r e
oggetti di tipo diverso */
for (int i = 0; i < 3; i++)gatti.add(new Cane(i));
}}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Svantaggi
Uno svantaggio tipico e la perdita di informazione sul tipoquando si inseriscono oggetti nel contenitore. Infatti:
poiche non vi sono restrizioni sul tipo di oggetti inseribilinel contenitore, e possibile inserire senza problemi cani inuna collezione di gatti (fonte di potenziali errori)a causa della perdita del tipo, occorre eseguire unaforzatura (cast) “corretta”, a run time, all’attodell’estrazione dell’oggetto per non incorrere inun’eccezione
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempio
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();
}}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Parametrizzare la lista
Per ovviare ai problemi precedenti e lecito definire una nuovaclasse lista parametrizzatY
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));
for (Gatto g : gatti) // estrai
out.println(g);for (Cane c : cani)
out.println(c);
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Vantaggi nell’uso di generici
I principali vantaggi dovuti all’introduzione dei tipi generici sono:
Il compilatore puo verificare qulasiasi operazione add dioggetti alla collezioneil tipo dell’oggetto estratto da una collezione e noto, quindinon vi e la necessita di operare un cast a un tipo diverso(fonte di potenziali errori se il cast e fatto su tipi nonomologhi)
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
ArrayList vs LinkedList
ArrayList ottimizzato l’accesso casuale (basato su array),non ottimizzati l’inserimento e l’eliminazioneall’interno della lista (grosso modo equivalente aVector)
LinkedList ottimizzato l’accesso sequenziale, l’inserimento el’eliminazione, indicato per implementare pile(LIFO) e code (FIFO), infatti contiene i metodi:addFirst(), addLast(), getFirst(),getLast(), removeFirst( ),removeLast()
�@5GG9�Collections!!MeHe!a!disposizione!metodi!per!effeHuare!operazioni!generiche!con!le!Collezioni.!• Ordinare!una!lista!(sort)!• Mescolare!una!lista!(shuffle)!• Scambiare!elemen2!di!una!lista!(swap)!• Copiare!una!lista!(copy)!• …!Ne!esiste!una!equivalente!anche!per!gli!array!(Arrays).!
�@5GG9�Collections!!Esempio:!metodi!sort!!static void sort(List<T> list)!Sorts!the!specified!list!into!ascending!order,!according!to!the!natural'ordering!of!its!elements.!
!!static void sort(List<T> list, Comparator<? super T> c) !Sorts!the!specified!list!according!to!the!order!induced!by!the!specified!comparator. !!
�@5GG9�Collections!!Esempio:!metodo!sort!Ordiniamo!una!lista!di!Integer!secondo!l’ordine!naturale.!List<Integer> listaInteri = new ArrayList<Integer>();!listaInteri.add(5);!listaInteri.add(2);!listaInteri.add(9);!Collections.sort(listaInteri);!System.out.println("Lista di interi ordinata: ");!for (int i:listaInteri) {! System.out.println(i);!
} !!
$BH9F:577=5�Comparable!! Per!definire!l’ordinamento!naturale!di!una!classe,!la!classe!deve!implementare!l’interfaccia!Comparable.!E’#buona#norma#che#il#metodo#compareTo#sia#simmetrico#e#consistente#con#equals!##java.u7l#Interface#Comparable<T>#T!C!the!type!of!objects!that!this!object!may!be!compared!to!!int!compareTo(T#o)!Compares!this!object!with!the!specified!object!for!order.!Returns!a!nega2ve!integer,!zero,!or!a!posi2ve!integer!as!this!object!is!less!than,!equal!to,!or!greater!than!the!specified!object.!
�CAD5F5HCF=�! Un!comparatore!implementa!un!metodo!compare!per!comparare!due!oggeV!secondo!un!ordine!totale.!Puo’!essere!usato!come!secondo!argomento!del!metodo!Collections.sort.!E’#buona#norma#che#il#metodo#compare#sia#simmetrico#e#consistente#con#equals!##java.util Interface Comparator<T>!T!C!the!type!of!objects!that!may!be!compared!by!this!comparator!!int compare(T o1, T o2)!Compares!its!two!arguments!for!order.!Returns!a!nega2ve!integer,!zero,!or!a!posi2ve!integer!as!the!first!argument!is!less!than,!equal!to,!or!greater!than!the!second.!
�CAD5F5HCF=!!Esempio:!GaHo!comparabile!!public class Gatto implements Comparable<Gatto> {! // ....! @Override! public int compareTo(Gatto gatto) {! if (gatto.getID() == getID()) {! return 0;! } else if (gatto.getID() < getID()) {! return -1;! } else {! return 1;! }! }!
} !!
�CAD5F5HCF=!!Esempio:!GaHo!comparabile!Creiamo#un#comparatore#che#ordini#i#gaB#in#base#al#nome.!!public class NomeGattoComparator implements Comparator<Gatto> {!! @Override! public int compare(Gatto g1, Gatto g2) {! return g1.getNome().compareTo(g2.getNome());! }!
} !!
�CAD5F5HCF=�9�sort!!Esempio:!ordinamento!di!gaV!in!base!al!nome!!List<Gatto> gatti = new ArrayList<Gatto>();!gatti.add(new Gatto(1, "Tom"));!gatti.add(new Gatto(1, "Felix"));!gatti.add(new Gatto(1, ”Star"));!!System.out.println("Lista gatti:");!for (Gatto gatto:gatti) {! System.out.println(gatto.getNome());!}!Collections.sort(gatti, new NomeGattoComparator());!System.out.println("Lista gatti ordinata:");!for (Gatto gatto:gatti) {! System.out.println(gatto.getNome());!}!
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Scansione: for-each e Iteratori
Il costrutto for-each:
for (Object o : collection)System.out.println(o);
L’interfaccia Iterator:
public interface Iterator<E> {boolean hasNext();E next();void remove();
}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Uso: for-each e Iteratori
Si usa l’iteratore�Yd�hgklg�\a �for-each quando:
si deve rimuovere il corrente oggetto (esempio filtraggio)static void filter(Collection c) {
for (Iterator i = c.iterator(); i.hasNext();) {if (!cond(i.next()))i.remove();
}
si deve rimpiazzare un elemento nella lista o nell’arraydurante l’attraversamento
ListIterator<E> extends Iterator<E>
occorre iterare su molteplici collezioni simultaneamente
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Uso di Iterator
ProblemaUsare Iterator per modificare la classe CaniEGatti al finedi eliminare dalla lista gatti i gatti con ID dispari e dalla listacani i cani con ID pari
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Codifica
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));
// iterator
for (Iterator<Gatto> eG = gatti.iterator(); eG.hasNext();){if ((eG.next().getID() % 2) == 1)eG.remove();
}for (Iterator<Cane> eC = cani.iterator(); eC.hasNext();) {if ((eC.next().getID() % 2) == 0)eC.remove();
}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Indice
1 Le Collezioni (Java Collections)Modellare liste e insiemiEsempi di ListeScansione: for-each e IteratoriEsempi di insiemiMappe
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
L’interfaccia Set
public interface Set<E> extends Collection<E> {// Op e r a z i o n i base
int size();boolean isEmpty();boolean contains(Object element);boolean add(E element); // Optional
boolean remove(Object element); // Optional
Iterator iterator();
// Op e r a z i o n i su c o l l e z i o n i
boolean containsAll(Collection<?> c);boolean addAll(Collection<? extends E> c); // Optional
boolean removeAll(Collection<?> c); // Optional
boolean retainAll(Collection<?> c); // Optional
void clear(); // Optional
// O p e r a r igfa�km�YjjYq
Object[] toArray();<T> T[] toArray(T[] a);
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
La classe HashSet
Una della classi piu utili nella gestione di insieme di oggetti e laclasse HashSet
Set<T> insieme = new HashSet<T>(c);
Osservazione: Notare che si usa il tipo interfaccia Set per lavariabile insieme (pratica fortemente raccomadata). Siproduce codice molto flessibile. Per esempio, per averel’elenco ordinato:
Set<T> insieme = new TreeSet<T>(c);
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Il codice hash associato agli oggetti
Funzione hashUnY funzione hash in Java e una funzione che mappa unoggetto in un numero intero (codice hash)
Propriet
`
a:
oggetti logicamente uguali devono avere lo stesso codicehashOggetti distinti possono avere lo stesso codice hash(collisione), l’importante e che questo fatto sia piuttostoinfrequenteDeve essere una funzione semplice e “veloce” dacalcolare, possibilmente dipendente da campi della classe
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Il metodo hashCode()
Contratto di Object.hashCodeIl metodo hashCode deve produrre lo stesso numero anchequando invocato piu volte sullo stesso oggetto. Se due oggettisono uguali in accordo al metodo equalk(Object o), allora ilmetodo hashCode invocato su entrambi gli oggetti deveprodurre lo stesso numero. Non e richiesto che oggetti diversiproducano codici hash distinti
Osservazioni: normalmente questo contratto viene disatteso!Per usare HashSet e fondamentale osservarlo!Regola: si deve sovrascrivere hashCode() in tutte le classiove viene sovrascritto equalk(Object o)
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempi di codici hash
...System.out.println("cane".hashCode());System.out.println("cane".hashCode());System.out.println("gatto".hashCode());Quadrato q = new Quadrato(1);System.out.println(q.hashCode());q = new Quadrato(1);System.out.println(q.hashCode());q = new Quadrato(2);System.out.println(q.hashCode());Persona p = new Persona("Paolo","Rossi");System.out.println(p.hashCode());p = new Persona("Paolo","Rossi");System.out.println(p.hashCode());p = new Persona("Paola","Rossi");System.out.println(p.hashCode());...
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Stampa dei Risultati
Esecuzione del metodo main della classe HashCodeEx:
HashCode di: "cane" -> 3046037HashCode di: "cane" -> 3046037HashCode di: "gatto" -> 98127573HashCode di: Quadrato(1) -> 19972507 //non definitoHashCode di: Quadrato(1) -> 7754385 //non definitoHashCode di: Quadrato(2) -> 2548785 //non definitoHashCode di: Persona("Paolo","Rossi") -> -1832489941HashCode di: Persona("Paolo","Rossi") -> -1832489941HashCode di: Persona("Paola","Rossi") -> -1832490375
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Uso di HashSet
ProblemaUsare la classe HashSet (TreeSet) per trovare le paroleduplicate in una stringa passata come argomento sulla linea dicomando
>java TrovaDuplicati ciao mamma ciao
Duplicati: ciao2 parole distinte: [mamma, ciao]
Duplicati: ciao2 parole distinte (ordinate): [ciao, mamma]
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempio
import java.util.*;
class TrovaDuplicati {public static void main(String args[]) {
Set<String> s = new HashSet<String>();for (String a : args)
if (!s.add(a))System.out.println("Duplicati: " + a);
System.out.println(s.size() + " parole distinte: " + s);
s = new TreeSet<String>();for (String a : args)
if (!s.add(a))System.out.println("Duplicati: " + a);
System.out.println(s.size() + " parole distinte (ordinate): " + s);}
}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Indice
1 Le Collezioni (Java Collections)Modellare liste e insiemiEsempi di ListeScansione: for-each e IteratoriEsempi di insiemiMappe
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
L’interfaccia Mappa
public interface Map<K,V> {// Operariona�ZYk]V put(K key, V value);V get(Object key);V remove(Object key);boolean containsKey(Object key);boolean containsValue(Object value);int size();boolean isEmpty();// Operariona�km�afka]eavoid putAll(Map<? extends K,? extends V> t);void clear();
// Collezionipublic Set<K> keySet();public Collection<V> values();public Set<Map.Entry<K,V>> entrySet();
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Mappe
Map Un gruppo di coppie di oggettichiave-valore. Una Map puorestiluire un Set di chiavi, unaCollection di valori o un Setdelle sue coppie.Idea: associare oggetti (chiave) aoggetti (valore), invece diassociare numeri a oggetti (comeArrayList) HashMap
Map
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Uso di HashMap
ProblemaUsare la classe HashMap (TreeMap) per calcolare leoccorrenze di ogni singola parola�ljY�d]� stjaf_`] passat]�[ge]argomento sulla linea di comando
>java FrequenzaParole ciao mamma ciao
2 parole distinte:{mamma=1, ciao=2}
2 parole distinte (ordinate):{ciao=2, mamma=1}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Esempio
public class FrequenzaParole {public static void main(String args[]) {
Map<String, Integer> m = new HashMap<String, Integer>();for (String a : args) {
Integer freq = m.get(a);m.put(a, (freq == null ? 1 : freq + 1));
}System.out.println(m.size() + " parole distinte:");System.out.println(m);
m = new TreeMap<String, Integer>();for (String a : args) {
Integer freq = m.get(a);m.put(a, (freq == null ? 1 : freq + 1));
}System.out.println(m.size() + " parole distinte:");System.out.println(m);
}}
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Problema
ProblemaScrivere un programma che mostri la pseudo casualita delgeneratore di numeri casuali implementato nella classejava.util.Random utilizzando la classe Contatore percontare le occorrenze dei numeri.
Metodo: genero molti (10000) numeri nell’intervallo [1, 10] emostro la frequenza con cui si manifestano, quindi stampo lacoppia (numero, frequenza)
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Risultato
>java DistUniformeDemoFrequenze di 10000 numeri (tra 1 e 10) generati a caso:
[1=974, 2=1000, 3=954, 4=1010, 5=993, 6=1049, 7=996,8=1000, 9=977, 10=1037]
Le Collezioni (Java Collections)
Modellare liste e insiemi
Esempi di liste
Scansione
Esempi di insiemi
Mappe
Problema con mappe ordinate per chiave
ProblemaScrivere un programma che gestisca una rubrica telefonica:una chiave (ordinabile), per es. cognome e un valore per es.Persona.Si consiglia l’uso di java.util.TreeMap