Rifugi di montagna

Sviluppare un'applicazione che consenta di gestire le informazioni sui rifugi di montagna di una regione.
L'applicazione deve permettere di inserire le informazioni su intervalli di altitudine, comuni e rifugi di montagna.
Tutte le classi devono essere nel package "mountainhuts".

R1 - Intervalli di altitudine

L'interazione con il sistema avviene tramite la classe Region. Il metodo getName() della classe Region ritorna il nome della regione specificato nel suo costruttore.

I rifugi sono classificati in base a delle fasce di altezza, che possono essere definite secondo le necessità. Per definire gli intervalli di altitudine disponibili si utilizza il metodo setAltitudeRanges() che riceve come parametro un vettore di strighe. Ogni stringa rappresenta un intervallo di altitudine utilizzando il formato "[minValue]-[maxValue]". Per esempio, l'intervallo "0-1000" rappresenta le altitudini da 0 a 1000 metri sul livello del mare, estremo superiore incluso ed estremo inferiore escluso. Si supponga che gli intervalli siano tra loro disgiunti.

Il metodo getAltitudeRange() riceve come parametro il valore di un'altitudine e ritorna la rappresentazione testuale dell'intervallo (tra quelli predefiniti) in cui tale altitudine è presente, estremo superiore incluso. Se non è disponibile alcun intervallo per tale altitudine, il metodo ritorna l'intervallo di default "0-INF".

R2 - Comuni e rifugi di montagna

I comuni sono definiti utilizzando il metodo createOrGetMunicipality() che accetta come parametri la denominazione univoca del comune, la provincia e l'altitudine. Il metodo restistuisce un oggetto di classe Municipality. Se un comune con la stessa denominazione è stato creato in precedenza, il metodo ritorna il comune già disponibile, ignorando gli altri parametri.

I rifugi di montagna sono definiti utilizzando il metodo createOrGetMountainHut() che accetta come parametri la denominazione univoca del rifugio, la categoria, il numero di posti letto ed il comune in cui è situato. Il metodo createOrGetMountainHut() accetta opzionalmente il parametro relativo all'altitudine del rifugio. Il metodo restistuisce un oggetto di classe MountainHut. Se un rifugio con la stessa denominazione è stato creato in precedenza, il metodo ritorna il rifugio già disponibile, ignorando gli altri parametri.

Le classi Municipality e MountainHut offrono gli ovvi metodi getter. Il metodo getAltitude() della classe MountainHut restituisce un Optional che è vuoto (empty) se l'altitudine del rifugio non è stata specificata.

È possibile ottenere le collezioni dei comuni e rifugi disponibili utilizzando i metodi getMunicipalities() e getMountainHuts().

Suggerimenti

R3 - Lettura da CSV

È possibile, tramite il metodo statico fromFile(), creare un oggetto Region a partire dal nome e dalle informazioni contenute in un file, passati come parametri. Le informazioni sono relative alle classi illustrate sopra. Il metodo deve popolare la classe regione creando gli oggetti comune e rifugio descritti nel file.

Le informazioni relative ai rifugi della regione sono memorizzati in un file con codifica CSV che è strutturato in base alle seguenti colonne che contengono informazioni relative a comuni e rifugi di montagna:

# Colonna Informazioni relative alle classi
Municipality MountainHut
0 Province
1 Municipality
2 MunicipalityAltitude
3 Name
4 Altitude
5 Category
6 BedsNumber

Attenzione: il file contiene una riga per ogni rifugio, quindi le informazioni relative ai comuni possono essere replicate più volte.

I campi del file CSV sono separati da un punto e virgola (;). La colonna relativa all'altitudine del rifugio può essere vuota se tale informazione non è disponibile.

I dati relativi ai rifugi della regione Piemonte sono disponibili nel file: mountain_huts.csv ( * ).

Suggerimenti

R4 - Interrogazioni

Il metodo countMunicipalitiesPerProvince() restituisce una mappa contenente come chiave il nome di una provincia e come valore il numero dei comuni in tale provincia.

Il metodo countMountainHutsPerMunicipalityPerProvince() restituisce una mappa contenente come chiave il nome di una provincia e come valore un'altra mappa che fa corrispondere al nome di un comune il numero dei rifugi in esso presenti.

Il metodo countMountainHutsPerAltitudeRange() restituisce una mappa contenente come chiave gli intervalli di altitudine restituiti dal metodo getAltitudeRanges() e come valore il numero dei rifugi con un'altitudine inclusa in tale intervallo. Se l'altitudine del rifugio non è disponibile, si consideri l'altitudine del comune corrispondente.

Il metodo totalBedsNumberPerProvince() restituisce una mappa contenente come chiave il nome di una provincia e come valore il numero totale dei posti letto disponibili nei rifugi situati in tale provincia.

Il metodo maximumBedsNumberPerAltitudeRange() restituisce una mappa contenente come chiave gli intervalli di altitudine restituiti dal metodo getAltitudeRange() e come valore il numero massimo dei posti letto disponibili nei rifugi con un'altitudine inclusa in tale intervallo. Se l'altitudine del rifugio non è disponibile, si consideri l'altitudine del comune corrispondente.

Il metodo municipalityNamesPerCountOfMountainHuts() restituisce una mappa contenente come chiave il numero dei rifugi per comune e come valore una lista contenente i nomi dei comuni aventi tale numero di rifugi ordinata alfabeticamente.