Files

Scrivi la classe TextFormatter contenente il metodo:

public static String reformat(Path source)

Tale metodo legge il contenuto di un file di testo e lo ritorna formattandolo secondo le regole seguenti:

  1. il carattere a capo non è ammesso
  2. non ci sono spazi (' ') all’inizio e alla fine del testo
  3. non ci sono spazi multipli
  4. non ci sono spazi prima di un carattere di punteggiatura ('.', ',', ';', ':', '!', '?')
  5. dopo un carattere di punteggiatura c’è sempre uno spazio, a meno che:
    • sia l’ultimo carattere del testo (regola 2.)
    • sia seguito da un altro carattere di punteggiatura (regola 4.)

Ad esempio per un file contenente il testo:

  John,Malkovich?John   : Malkovich!!! !
     John     Malkovich   !? !?John;Malkovich .   .    .  

il metodo reformat ritorna la stringa:

John, Malkovich? John: Malkovich!!!! John Malkovich!?!? John; Malkovich...

Scrivi la classe CsvValidator contenente il metodo:

public static boolean isValid(Path csvFile)

Tale metodo verifica che il file in formato csv csvFile rispetti le seguenti regole:

  • contiene solo numeri interi nel range [1;100]
  • i valori sono disposti in una griglia di dimensione N x N
  • contiene lo stesso numero (N) di righe e colonne
  • su ogni riga vi sono N valori separati dal carattere ';'
  • non contiene righe vuote

Se tutte le regole sono rispettate il metodo ritorna true, in qualsiasi altro caso il metodo ritorna false. Se il file non è accessibile il metodo ritorna false.

Esempio di file valido (3 x 3):

1;2;3
4;5;6
7;8;9

Scrivi la classe TableParser contenente il metodo:

public static void convertTable(Path htmlFile, Path csvFile)

Tale metodo legge il file in formato HTML htmlFile. Se nel file HTML è contenuta almeno una tabella, il metodo converte il contenuto della prima tabella contenuta nel file in formato CSV e lo salva nel file csvFile.

La conversione avviene secondo le regole seguenti:

  • i commenti html vengono ignorati (<!---,--->)
  • solo la prima tabella viene esportata
  • la tabella è delimitata dai tag html <table> e </table>
  • ogni riga è delimitata dai tag html <tr> e </tr>
  • ogni colonna è delimitata dai tag html <td> e </td>
  • le tabelle non hanno header (non sono presenti tag <th> e </th>)
  • se il file HTML non è accessibile, se non contiene nessuna tabella, se la tabella non contiene righe o colonne, non viene generato nessun file csv.

Ad esempio per un file html contenente:

...
<h1>Tabella di test</h1>
<p>Prova a convertire la seguente tablella:</p>
<!-- Questo è un commento -->
<table><!-- Qui inizia la tabella -->
    <tr><!-- Prima riga -->
        <td>A</td><td>B</td><td>C</td><td>D</td>
    </tr><!-- Fine prima riga -->
    <tr><!-- Seconda riga -->
        <td>1</td><td>1234</td><td>cane<!--- BAU!!! --->
        </td><td>gatto</td>
    </tr><!-- Fine seconda riga -->
</table><!-- Qui termina la tabella -->
...

Verrà prodotto il seguente file CSV:

A;B;C;D;
1;1234;cane;gatto;

Scrivi il programma CharCounter che calcola la frequenza dei caratteri alfabetici contenuti in un file di testo. Il percorso del file è fornito come primo argomento da linea di comando. Il programma legge il contenuto del file e stampa il conteggio dei caratteri (case insensitive) e il tempo impiegato. Ad esempio, per un file contenente il testo seguente:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

il programma stampa:

'a': 29
'b': 3
'c': 16
'd': 19
'e': 38
'f': 3
'g': 3
'h': 1
'i': 42
'j': 0
'k': 0
'l': 22
'm': 17
'n': 24
'o': 29
'p': 11
'q': 5
'r': 22
's': 18
't': 32
'u': 29
'v': 3
'w': 0
'x': 3
'y': 0
'z': 0

Parse time: 6ms

Se il percorso fornito come primo argomento non è valido (non esiste, non è leggibile), il programma stampa il messaggio "Error reading <file>" e termina.

Se non vengono forniti argomenti il programma stampa il messaggio "Usage: java CharCounter <file>".

Per verificare il buon funzionamento del tuo programma puoi usare la Divina commedia e cronometrare il tempo impiegato (usa System.currentTimeMillis() per misurare il tempo).

Scrivi il programma ButterFyler utile per codificare un file di testo (UTF-8) in alfabeto farfallino e salvarlo in un file di destinazione (se non conosci l’alfabeto farfallino vedi wikipedia).

La classe deve contenere il metodo encode che codifica il file source e lo salva nel file dest:

public static void encode(Path source, Path dest)

Per verificare il buon funzionamento del tuo programma prova a codificare la Divina commedia e a cronometrare il tempo impiegato per la codifica (usa System.currentTimeMillis() per misurare il tempo).

Record e RankingManager

Record

La classe Record è utilizzata per rappresentare i dati di un record nella classifica di un videogioco. La classe è molto semplice; possiede solo i due attributi privati name (il nome del giocatore che ha fatto il record) e points (i punti totalizzati). Entrambi gli attributi sono accessibili in sola lettura.

La classe Record esporta pure il costruttore personalizzato che permette di inizializzare name e points (in questo ordine).

Inoltre Record esporta e il metodo String toString() che ne ritorna la rappresentazione testuale nel formato:

<name>: <points>

Esempio:

Luigi: 10000

RankingManager

Serve per caricare i record salvati in un file CSV e per trovare il giocatore con il punteggio più alto.

I record sono memorizzati nella lista di Record records (attributo privato List<Record>).

La classe RankingManager esporta i seguenti metodi:

Costruttore

public RankingManager(Path csvPath)

Il costruttore personalizzato permette di definire il percorso del file CSV.

loadRanking

public void loadRanking()

Carica i dati dal file CSV. Se non è possibile accedere o leggere il file, solleva una IOException. Le righe del file CSV che contengono dati non validi non vengono importate.

getRecords

public List<Record> getRecords

Ritorna la lista (records) dei record caricati dal file CSV.

getWinner

public Record getWinner()

Ritorna il Record con il punteggio più alto in records. Se la lista è vuota ritorna null.

Formato del file CSV

Su ogni riga del file CSV deve essere registrato un record nel formato:

<name>,<points>

Dove:

  • <name>: stringa non vuota, deve contenere almeno un carattere diverso da ‘ ‘ (blank)
  • <points>: numero intero

Tutte le righe che non rispettano questo formato sono considerate non valide e vengono ignorate dal metodo loadRanking.

Ad esempio un file CSV valido potrebbe contenere i dati seguenti:

Mario,50
Alb,-200
Luigi,10000
Zorro,0
Pippo,400

Employee e EmployeeManager

Employee

La classe Employee è utilizzata per rappresentare i dati di un impiegato aziendale e il suo stipendio. La classe è molto semplice; possiede solo i due attributi privati name (il nome dell’impiegato) e salary (lo stipendio dell’impiegato [double]). Entrambi gli attributi sono accessibili in sola lettura.

La classe Employee esporta pure il costruttore personalizzato che permette di inizializzare name e salary (in questo ordine).

Inoltre Employee esporta e il metodo boolean equals(Employee e) che ritorna true se i due impiegati confrontati posseggono lo stesso nome (ignora maiuscole e minuscole) e lo stesso stipendio.

EmployeeManager

Serve per caricare i dati riguardanti gli impiegati da un file CSV e per trovare la media degli stipendi.

I dati sono memorizzati nella lista di Employee employees (attributo privato List<Employee>).

La classe EmployeeManager esporta i seguenti metodi:

Costruttore

public EmployeeManager(String csvPath)

Il costruttore personalizzato permette di definire il percorso del file CSV.

loadEmployees

public void loadEmployees()

Carica i dati dal file CSV. Se non è possibile accedere o leggere il file, solleva una IOException. Le righe del file CSV che contengono dati non validi non vengono importate.

getEmployees

public List<Employee> getEmployees()

Ritorna la lista (employees ) degli impiegati.

getAverageSalary

public double getAverageSalary()

Ritorna lo stipendio medio (tra tutti quelli contenuti in employees). Se la lista è vuota ritorna -1.0.

Formato del file CSV

Su ogni riga del file CSV deve essere registrato un impiegato nel formato:

<salary>;<name>

Dove:

  • <salary>: numero double
  • <name>: stringa non vuota, deve contenere almeno un carattere diverso da ' ' (blank)

Tutte le righe che non rispettano questo formato sono considerate come non valide e vengono ignorate dal metodo loadEmployees.

Ad esempio un file CSV valido potrebbe contenere i dati seguenti:

1250.5;Mario
200;Alb
1000.5;Luigi
8230.25;Zorro
400;Pippo