Sei sulla pagina 1di 18

Collection e

comparable
Lezione sulle collection e l interfaccia comparable

Antonio Emanuele Cin


854866

Comparable
Rappresenta tutti gli oggetti sui quali definito un ordinamento totale.

Comparable un' interfaccia generica, ci significa che ha un tipo generico T


public class Studente implements Comparable<Studente> {
}
Abbiamo cosi definito una classe Studente i quali oggetti possono essere disposti
secondo un ordine prestabilito.

Comparable
L interfaccia Comparable richiede di implementare il metodo compareTo.
Firma: public int compareTo( T obj)
Dove T rappresenta il tipo generico che abbiamo passato come parametro.
Il metodo compareTo ritorna un intero :
0 , se i due elementi hanno stessa propriet di ordinamento
>0 , se l oggetto su cui ho richiamato la compare pi grande
<0 , se loggetto passato come parametro pi grande

Esempio Comparable
Decidiamo di voler creare un ordine sugli studenti basato sulla loro matricola

Comparable & TreeSet


Che utilit pu avere implementare l interfaccia Comparable?
Implementando l interfaccia Comparable possiamo usufruire della collection
TreeSet.
TreeSet una Collection che implementa l interfaccia Set e possiede due
caratteristiche importanti:
Gli oggetti interni ad una TreeSet sono unici
Gli oggetti interni ad una TreeSet sono disposti in modo ordinato

TreeSet
I metodi (principali) che ci mette a disposizione la classe TreeSet per gestire la
collection sono:

boolean add (T obj)


boolean remove (Object obj)
boolean contains (Object obj)
Iterator iterator ()
boolean isEmpty ()
int size ()
void clear()

Un po' di codice
Supponiamo di voler creare una classe Classe per poter gestire gli studenti di una classe scolastica. (vogliamo poter
memorizzare gli studenti tenendo conto le loro matricole)

Un po di codice

Errore di codice
Cosa sarebbe successo se sugli studenti non avessi prestabilito un ordine?
Errore di compilazione?

NO, per il compilatore non c alcun


problema.

Errore di codice
Ed in fase di esecuzione?

Comparator
Un altra soluzione per dichiarare un ordinamento era di utilizzare un oggetto
Comparator.
L interfaccia Comparator un interfaccia generica
public class MioComparatore implements Comparator<Studente> {
}
MioComparatore una classe che si occuper di definire un ordine per i miei
oggetti.

Comparator
L interfaccia comparator richiede di implementare il metodo compare
Firma: public int compare( T obj1 , T obj2 )
Dove T indica il tipo parametrico passato nella dichiarazione dell oggetto.
Ritorna un intero che rappresenta :
0 , se i due elementi hanno stessa propriet di ordinamento
>0 , se obj1 pi grande
<0 , se obj2 pi grande

Utilit
Supponiamo di voler usare le stesse classi Studenti e Classe ma di voler creare un
ordinamento in base alla media degli studenti e non in base alle loro matricole.
Abbiamo due soluzioni:
Riscriviamo il metodo compareTo della classe Studente, ma a questo punto
dovremmo farlo ogni qualvolta che vogliamo cambiare ordinamento.

Usare un oggetto comparator e tenerci pi ordinamenti possibili

Un po di codice
Costruiamo il nostro comparatore per la media.

Un po di codice
La classe TreeSet utilizzata da noi per gestirci la collezione di studenti in modo
ordinato ci offre un costruttore che inizializza un comparatore per l insieme.

Costruttore senza
comparatore
Costruttore con comparatore

Un po di codice

Un po di codice
Nella slide precedente abbiamo visto come usare un comparatore. Il problema
per sta nel dover reinserire ogni elemento. Come si pu risolvere?
Usando il metodo addAll della nostra TreeSet

Domande?

Contatti:
854866@stud.unive.it
account universitario
cina.antonio1995@gmail.com
personale