I pazienti sono caratterizzati da nome, cognome, e dal codice fiscale (SSN).
Nuovi pazienti possono essere aggiunti tamite il metodo addPatient().
Le informazioni su un paziente possono essere recuperate tramite il metodo
getPatient() che, dato un codice fiscale restituisce un oggetto di tipo Person.
Tale classe fornisce i metodi getter per SSN, nome e cognome.
Se il paziente non esiste viene generata l'eccezione NoSuchPatient.
Si tenga presente che un dottore potrebbe essere paziente dello stesso ambulatorio.
IL file è organizzato per righe; ogni riga contiene informazioni
relative a pazienti o a dottori.
Le righe contenenti informazioni sulle persone iniziano con la lettera "P"
seguita da nome, cognome, e SSN. Le righe che descrivono i dottori iniziano
con la lettera "M", seguita da numero di badge, nome, cognome, SSN e specialità.
Tutti gli elementi su una linea sono separati dal carattere ";".
In caso di errore nei contenuti del file, il metodo ignora la linea e passa a quella successiva.
In caso di errori di IO le eccezioni devono essere propagate al chiamante.
Il metodo busyDoctors() restituisce la collezione dei dottori che hanno un numero di pazienti superiore alla media.
Il metodo doctorsByNumPatients() restituisce una collezione di stringhe
contenenti il nome del dottore ed il relativo numero di pazienti
ordinati in maniera decrescente di numero.
Le stringhe devono essere formattate come "### : ID SURNAME NAME"
dove ### rappresenta il numero di pazienti (stampato su tre caratteri).
Il metodo countPatientsPerSpecialization() conta il numero di pazienti per
specializzazione (dei dottoir).
Gli elementi della lista di stringhe sono ordinati prima per numero decrescente id pazienti
e poi in ordine alfabetico di specializzazione.
Le stringhe sono strutturate come "### - SPECIALITY" dove ###
rappresenta il numero di pazienti (stampato su tre caratteri).