Collezioni
Collezioni 2 Java Collection Framework (JCF): supporto a qualunque struttura dati per contenere "elementi generici". Collection: nessuna ipotesi sul tipo di collezione Set: introduce l idea di insieme di elementi (quindi, senza duplicati) List: introduce l idea di sequenza Map: introduce l idea di mappa, tabella che associa chiavi a valori
3 Collezioni JDK <=1.4: uso di Object come elemento generico JDK >=1.5: uso del tipo generico Collection Collection<X> boolean add(object o) boolean add(x o) boolean contains(object o) boolean contains(x o) boolean remove(object o) boolean remove(x o) int size() boolean isempty() Iterator iterator() int size() boolean isempty() Iterator<X> iterator()
4 Collezioni: accesso agli elementi Iteratore: strumento per "ciclare" su una collezione di elementi, determinando di volta in volta l'elemento "successivo" Iterator boolean hasnext() Object next() Iterator<X> boolean hasnext() X next() Accesso diretto ArrayList ArrayList<X> Object get(int i) X get(int i) Object set(int i, Object o) X set(int i, X o) Object remove(int i) X remove(int i) void add(int i, Object o) void add(int i, X o) int indexof(object o) int indexof(x o)
5 Mappe Tabelle a due colonne: le chiavi (1ª colonna) identificano univocamente gli elementi nella 2ª colonna. Si può accedere direttamente ad un elemento, conoscendo la chiave associata HashMap<X,Y> Y put(x k, Y v) Y get(x k) Y remove(x k) int size() boolean isempty() Set<X> keyset() Chiave Mario Rossi, Via col vento 18. Valore 051213225 Esempio elenco telefonico: Ad ogni persona (nome, cognome, indirizzo) è associato un numero di telefono Map<Persona,String> elenco = new HashMap<Persona, String>(); Persona p = new Persona("Mario","Rossi","Via col vento, 18"); elenco.put(p,"051213225"); String numerocercato = elenco.get(p);
6 Esercizio 1: piano telefonico Si scriva un programma Java che definisca opportuni classi, costruttori e metodi per un servizio di telefonia. I dati gestiti dal programma sono relativi a: Tariffe, caratterizzate dalle informazioni: codice, nome. Telefonate, caratterizzate dalle informazioni: sorgente (numero del telefono che chiama), destinazione (numero chiamato), durata, data (stringa nel formato gg/mm/aaaa). Le tariffe si suddividono in: Flat (codice F-<#progressivo>), con un canone mensile. A minuti (codice M-<#progressivo>), con costo al minuto e scatto alla risposta. Si supponga che tali informazioni siano contenute in una classe GestoreTelefonico nelle strutture dati: un vettore tariffe, contenente le tariffe (max 15); Un insieme telefonate, contenente le telefonate; una mappa tariffeutenti, che associa ad ogni numero di telefono la tariffa. Si assuma che le strutture dati siano già inizializzate con un numero imprecisato di elementi. Si definiscano i soli metodi getter e setter necessari all esecuzione del programma. Si utilizzi la programmazione generica.
Esercizio 1: piano telefonico Si definiscano i seguenti metodi, all interno dei quali non è consentita l immissione di valori da standard input (escluso il programma principale o se diversamente specificato)(n.b.: svolgere tutti i punti nel modo più efficiente): 1. metodo cercatariffa che, dato il nome di una tariffa, restituisca la tariffa corrispondente, lanciando un'eccezione se questa non viene trovata 2. metodo registrautente che, dato il numero di un utente e il nome di una tariffa, aggiunga alla mappa una nuova coppia numero-tariffa. Si utilizzi il metodo del punto 1, senza gestire l'eccezione lanciata. 3. metodo telefonatemensili che, dati il numero di telefono di un utente e una stringa contenente un mese di riferimento (nel formato mm/aaaa), restituisca la lista delle telefonate effettuate dall'utente in quel mese. 4. metodo calcolacostomensile che, dati il numero di telefono di un utente e una stringa contenente un mese di riferimento (nel formato mm/aaaa), calcoli l'importo dovuto dall'utente: se l'utente ha una tariffa flat, paga solo il canone mensile, altrimenti, l'importo è dato dalla somma dei costi delle singole telefonate (durata * costo al minuto + scatto alla risposta). Il programma principale deve, infine, svolgere seguenti punti: a) richiedere all utente numero di telefono e il nome di una tariffa e richiamare il metodo del punto 2) per la registrazione, gestendo eventuali eccezioni e richiedendo l'inserimento dei dati. b) richiedere all utente numero di telefono e un mese e richiamare il metodo del punto 4), stampando a video il risultato. 7
8 Esercizio 2: e-learning Si scriva un programma Java che definisca opportuni classi, costruttori e metodi per la gestione di una piattaforma di e-learning. I dati gestiti dal programma sono relativi a: Contenuti, caratterizzati da un codice. Studenti, caratterizzati da un nome e da una tabella che associa ad ogni test il voto ottenuto. I contenuti si suddividono in: Lezioni (codice L-<#progressivo>), caratterizzate da un testo e un insieme di argomenti. Test (codice T-<#progressivo>), con un argomento e una lista di quiz (domanda e risposta vero/falso). Si supponga che tali informazioni siano contenute in una classe Corso, in un vettore contenuti, contenente massimo 100 contenuti; Si assuma che le strutture dati siano già inizializzate con un numero imprecisato di elementi. Si definiscano i soli metodi getter e setter necessari all esecuzione del programma. Si utilizzi la programmazione generica.
9 Esercizio 2: e-learning Si definiscano i seguenti metodi, all interno dei quali non è consentita l immissione di valori da standard input (escluso il programma principale o se diversamente specificato)(n.b.: svolgere tutti i punti nel modo più efficiente): 1. metodo calcolavoto che, data una lista di risposte, le confronti con le risposte corrette ai quiz in un test, calcolando un voto in decimi ((risposte corrette/n quesiti) *10) e restituendo un voto espresso come: Insufficiente(voto<6), Sufficiente (6<=voto<7), Buono (7<=voto<8), Ottimo (voto >=8). Si lanci un eccezione se il numero di risposte date in ingresso non è uguale al numero di domande nel test. 2. metodo lezioniperargomento che, dato un argomento, restituisca la lista delle lezioni che trattano tale argomento. 3. metodo sostienitest che, dati il codice di un test, lo studente e una lista di risposte, cerchi il test corrispondente, invochi il metodo del punto 1) per calcolare il voto e lo aggiunga alla mappa dei test sostenuti dallo studente. Si rilanci l eccezione del metodo del punto 1) e si lanci un eccezione se non viene trovato nessun test relativo all argomento in ingresso. 4. metodo verificaconclusionecorso che, dato uno studente, verifichi se l utente ha sostenuto tutti i test, riportando voti non inferiori a Sufficiente. Il programma principale deve, infine, svolgere seguenti punti: a) richiedere all utente l argomento di una lezione, invocare il metodo del punto 2 e mostrare a video il codice e il testo di ogni lezione trovata. b) richiedere all utente il codice di un test e una lista di risposte, invocare i metodi del punto 3 e del punto 4 (relativamente ad uno studente creato in precedenza), mostrando a video i risultati.