Programmazione II 
Esercitazione del 27 marzo 2014
================================ 

(0) Un Vocabolario e' una collezione di associazioni del tipo 
'chiave -> valore', dove sia 'chiave' che 'valore' sono stringhe, 
e valgono le seguenti proprieta':

- non ci possono essere due associazioni per la stessa chiave;
- le associazioni sono ordinate in base alla chiave. 

[Sulle chiavi (oggetti della classe String) e' definito il metodo 
"int compareTo(String s)" che resituisce un numero negativo se this precede
lessicograficamente s, positivo nel caso contrario, e 0 se sono
uguali. Infatti String implements Comparable<String>.]

Rappresentiamo astrattamente un vocabolario con n associazioni come

=====================
chiave-1 -> valore-1
chiave-2 -> valore-2
...
chiave-n -> valore-n
====================

dove chiave-i < chiave-(i+1) per ogni 0 <= i < n. 

(1) Fornire (SCRIVENDO UN'INTERFACCIA JAVA) la specifica del tipo di
dati astratto "Vocabolario" con le seguenti operazioni

a) controllo se esiste una associazione per una data chiave
b) ricerca di un valore in base alla chiave
c) inserimento di una nuova associazione nel vocabolario
d) cancellazione di una associazione dal vocabolario, in base alla chiave

(2) La OVERVIEW del TdA e' quella fornita sopra al punto (0): copiarla
in un commento.

Per ogni metodo, oltre all'intestazione (scegliendo un nome
informativo e indicando parametri formali e tipo del risultato),
decidere quali eccezioni puo' lanciare e indicarle nell'intestazione.
Fornire la specifica di ogni metodo, con le clausole REQUIRES,
MODIFIES e EFFECTS.  L'interfaccia deve compilare correttamemnte.

In particolare, se si inserisce una associazione "key -> value" e
esiste gia' una associazione per la chiave "key", la vecchia
associazione deve essere sovrascritta.

(3) Completata l'interfaccia, copiarla nel file "VocabolarioGe.java" e
rendere generica la specifica usando i tipi generici Java. Il nuovo
TdA si deve chiamare "VocabolarioGen<T>" e rappresenta un Vocabolario
come sopra, dove le chiavi sono sempre di tipo String ma i valori sono
del tipo T.

Cambiare con attenzione le operazioni, in modo consistente con la
modifica da String a T del tipo dei valori.

(4) Scambia i file che realizzano le specifiche, Vocabolario.java 
e VocabolarioGen.java, con il primo collega che trovi che (1) non abbia 
svolto l'esercizio con te (2) sia pronto a scambiare le specifiche con te. 

(5) Implementare le specifiche del collega, scegliendo
rappresentazione concreta, definendo funzione di astrazione e
invariante di rappresentazione, e implementando tutti i metodi secondo
la specifica. Si suggerisce di implementare direttamente la versione
generica. Interagire con il collega se si trovano errori, imprecisioni 
o ambiguita' nella sua specifica.

Per la rappresentazione concreta del TdA, usare una 
delle classi di Java che implementano l'interfaccia List<E>
(si veda http:docs.oracle.com/javase/7/docs/api/java/util/List.html)
per esempio Vector<E>, LinkedList<E>, ArrayList<E>.
Quindi il Vocabolario sara' una lista di associazioni, ordinate per
chiave. Naturalmente si possono usare altre variabili d'istanza, se si
vuole.

(7) Controllare la correttezza dell'implementazione usando le
asserzioni Java e un programma di test.

(6) Dimostrare la correttezza dell'implementazione, e cioe':
- che ogni metodo preservi l'invariante di rappresentazione
- che ogni metodo sia implementato correttamente rispetto alla
specifica.

===================================================================