Ambulatorio

Realizzare un sistema per gestire i pazienti di un ambulatorio.
Le classi sono contenute nel package clinic.

R1: Pazienti

La classe principale del programma è Clinic.

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.

R2: Dottori

I dottori sono caratterizzati da nome, cognome, SSN, numero di badge e dalla specializzazione (es. "cardiologo", "dentista"). È possibile aggiungere un nuovo dottore tramite il metodo addDoctor().
Il meotdo getDoctor(), dato il numero di badge restituisce un oggetto di classe Doctor. Tale classe estende Person e fornisce i getter per il badge e la specialità.
Se il dottore non esiste viene generata l'eccezione NoSuchDoctor.

Si tenga presente che un dottore potrebbe essere paziente dello stesso ambulatorio.

R3: Registrazione dei pazienti

Quando sono accettati, i pazienti vengono assegnati a uno dei dottori dell'ambulatorio. Per questo si usa il metodo assignPatientToDoctor(), che accetta come parametri il codice fiscale del paziente ed il numero di badge del dottore. Se il dottore non esiste, viene generate l'eccezione NoSuchDoctor, mentre se il paziente non esiste viene generata l'eccezione NoSuchPatient.
Tramite il metodo getDoctor() della classe Person è possibile ottenere un riferimento al dottore assegnato alla persona.
Il metodo getPatients() della classe Doctor restituisce la collezione di pazienti del dottore.

R4: Lettura

Il metodo loadData() della classe Clinic accetta un path e legge dal corrispondente file le informazioni su pazienti e dottori.

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.

R5: Statistiche

Il metodo idleDoctors() resituisce una collezione con tutti i dottori che non hanno pazienti, ordinata in ordine alfabetico.

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).

Suggerimento: